2016-04-28 86 views
0

我想创建一个基类与函数,当继承时,返回子类的实例。什么我目前想摘要版:CRTP和函数,返回派生类型的一个实例

A.H:

#include <string>  

template <typename Derived> 
class A { 

public: 
    A<Derived>(); 

    Derived Append(wchar_t the_char) const; 

protected: 
    std::wstring some_string; 

} // class A 

A.cpp:

#include "A.h" 

A<class Derived>::A() {} 

Derived A::Append(wchar_t the_char) const 
{ 
    Derived d(some_string); 
    d.some_string += the_char; 
    return d; 
} 

B.h:

class B : public A<B> 
{ 
public: 
    B(); 
}; 

B.cpp:

B::B() : A() {} 

我希望能够用这个做的是类似如下:

B theObj; 
theObj = theObj.Append(L'h'); 

不过,我无法找到组织的一种方式代码来实现这一点。我不确定是否有某种形式的前向声明需要在这里或什么。尝试了几件事,但没有运气。思考?

+0

可能你正在寻找这个:http://stackoverflow.com/a/11761568/1726343 –

+0

@AsadSaeeduddin那么,我想返回的东西不是一个指针或对现有对象的引用,而是一个副本修改应用于堆栈上的该对象。我也正在使用现有的代码库,所以我不想在整个解决方案中进行操作,并更改类的使用方式的语义。我只想有一个基类,我可以用它来分享相似但不相同的子类之间的代码。 我发布的代码的问题是,在编译代码时,“派生”被认为是未定义的。 – ShiggityShiggityShwa

+0

@ShiggityShiggityShwa http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file –

回答

2

你在找这个语法吗?

template<class Derived> 
Derived A<Derived>::Append(wchar_t the_char) const 
{ 
    Derived d(some_string); 
    d.some_string += the_char; 
    return d; 
} 

把它放在一个cpp文件中不会有太大好处。你最好把它添加到头文件中,或者创建一些你可以包含的其他文件(MS有时称为.inl)以使其用户可以访问它。