다음은 내가 수행하고자하는 작업입니다.C++ 11 템플릿 기반이 아닌 기본 클래스의 순수 가상 템플릿 형식 return
다양한 유형의 링크 된 목록을 만들려고합니다. 이것을 달성하기 위해, 나는 다형성이 좋은 방법이 될 것이라고 생각했습니다.
저는 AttributeBase와 Attribute의 두 클래스가 있습니다. AttributeBase는 AttributeSet에 의해 사용되며, AttributeBase *의 속성으로 연결된 <T>의 연결 목록의 시작과 끝 지점을 저장하고 목록에서 수정을 수행합니다. AttributeBase는 일반 포인터를 만들기위한 목적으로 만 디자인 된 속성 <T>의 기본 클래스입니다. 속성 <T>은 물론 실제 값이 저장된 AttributeBase의 특정 유형입니다.
: 각 속성 <T>의 주요 데이터는 지금까지 내가 (간체) 한 상속 된 문자열 (속성의 이름, 또는 '키'만약에 당신)와그래서 T 형식의 값을,이다
class AttributeBase
{
public:
AttributeBase() = delete;
AttributeBase* GetNext() { return next; };
AttributeBase* GetPrev() { return prev; };
std::string GetName() { return name; };
//Sometimes I need to get/set the value stored in a derived class
//But, how would I define the function here since the return
//type is of type T as defined in Attribute?
virtual ???? GetValue = 0;
virtual void SetValue(????) = 0;
friend class AttributeSet;
private:
AttributeBase* next = nullptr;
AttributeBase* prev = nullptr;
std::string name;
};
template <class T>
class Attribute : public AttributeBase
{
public:
Attribute(std::string _name, T _value){ name = _name; value = _value };
T GetValue(){ return value; };
void Setvalue(T){ value = T; };
private:
T value;
};
class AttributeSet
{
public:
template <class T>
void Add(std::string,T); //Add an Attribute<T>(std::string,T) to the list
void Delete(std::string);
bool Contains(std::string _name); //Scan the list to determine if an
//attribute with name of _name exists
template <class T>
T Get(std::string); //Scan the list for 'name' and return
//AttributeBase*->GetValue()
private:
AttributeBase* start = nullptr;
AttributeBase* end = nullptr;
}
AttributeBase를 일반화하고 애트리뷰트 세트에 강하게 입력 된 시작 및 끝 포인터를 방지하기 위해 템플릿을 사용하지 않으려 고 시도한 이래로 문제가 발생합니다. 어떻게 가상 함수 BaseAttribute :: GetValue()에 대해 아직 지정되지 않은 반환 유형을 지정합니까? 먼저 auto
을 사용하여 컴파일 오류가 발생했습니다.
AttributeBase의 인스턴스가 실제로 생성되지 않고 (그리고 기본 생성자가 삭제 된) GetValue를 생략하고 파생 클래스에서 정의 할 수 있다고 생각했습니다. 그러나 * AttributeBase-> GetValue()를 시도하면 GetValue()가 AttributeBase에만 정의되어 있지 않으므로 오류가 발생합니다. 하위 클래스 만 정의됩니다. AttributeBase를 직접 생성 할 수 없기 때문에 포인터가 파생 클래스 (유일하게 파생 된 유형)를 가리켜 야한다는 것을 컴파일러가 알고 있다고 생각할 것입니다.
그래서 GetValue()를 사용하려면 AttributeBase *를 Attribute *로 형 변환 할 수 있도록 이전 값의 유형을 미리 알아야합니다. 이것은 AttributeBase 자체가 템플리트 화되고 값 T 유형을 포함하는 경우 사소한 것입니다. 그런 다음 AttributeBase * -> type에 액세스하여 캐스팅해야하는 포인터의 유형을 결정할 수 있습니다. 그러나, 내가 말했듯이, AttributeBase 템플릿은 객체의 의도 된 사용을 파괴합니다.
아마도 나는 완전히 잘못된 방식으로 (아직 또 다시)이 문제에 대해 이야기 할 것입니다. 그러나이 시점에서 나는 아이디어에 매달렸다. 어떤 도움을 주시면 감사하겠습니다!
'AttributeBase :: GetValue' 또는'AttributeBase :: SetValue'를 사용하는 코드 예제를 줄 수 있습니까? – aschepler