2016-11-03 9 views
1

У меня есть две разные группы классов, которые наследуются от двух разных базовых классов (Value и Token).Как мне назвать эти классы?

В обеих группах у меня есть классы, которые я бы просто назвал String, Number, Name, если только их имя не столкнулось с именем класса из другой группы.

Поэтому в основном я нужен способ, чтобы отличить класс String, который наследуется от Value из класса String, который наследуется от Token, и я не имею ни малейшего представления о том, как это сделать.

Я не могу поместить их в пространство имен своего базового класса, потому что ваш наследует от того же класса, в котором они находятся, и компилятор дает мне ошибку «недопустимое использование неполного типа». Как мне это разрешить?

+1

Почему бы вам не назвать их «ValueString» и «TokenString»? –

+0

@Eli Sadoff, потому что я не думал об этом решении, пока не опубликовал этот ответ. – user6245072

+1

Когда я сказал «почему бы и нет», я просто формулировал это так. Я не имел в виду «Ты идиот!». –

ответ

4

Простым решением является их имя StringValue и StringToken.

Вы не можете определить их в своих базовых классов, как:

struct Value 
{ 
    struct String : Value {}; 
}; 

Но вы можете определить их и базового класса внутри пространства имен:

namespace Value 
{ 
    struct Base {}; 
    struct String:Base {}; 
} 

, а затем обратитесь до Value::Base или Value::String.

Хотя я очень люблю пространства имен, в данном конкретном случае, я бы склонен к решению StringValue.

(Примечание.. Я использовал struct в примерах, поскольку он сохраняет все возни с public Для реального кода, вы, вероятно, хотите использовать class)

+0

На самом деле, технически вы можете поместить базовый класс за пределы пространства имен, но вы все равно не могли бы дать ему то же имя, что и пространство имен - и это было бы глупо! –

+0

Вы можете указать то же имя, что и пространство имен, если оно находится внутри пространства имен http://ideone.com/YPziDy – StoryTeller

+0

@vsoftco: Я знаю - вот почему я сказал, что вы ** не можете ** сделать это. –

1

Позвоните одному StringValue и другому StringToken?

2

Там не должно быть никаких проблем с разделяет пространства имен их.

struct Value {}; 
struct Token {}; 

namespace Values { struct String : Value {}; } 
namespace Tokens { struct String : Token {}; } 

должен работать, так как должен

namespace Values { struct Value {}; struct String : Value {}; } 
namespace Tokens { struct Token {}; struct String : Token {}; } 

Одна вещь, которая не будет работать в

struct Value 
{ 
    struct String : public Value {}; 
}; 

потому Value не полностью определена, когда вы пытаетесь наследовать от него ,
Если это то, что вы делаете, решение состоит в том, чтобы не делать этого.