这部分问题提供了背景信息,可以忽略
我正在开发一个模板库,该库严重依赖于奇怪重复的模板模式的使用。类结构背后的想法是用户可以
1)。使用带有标准方法的预定义类。这些类是基类的非常简单的叶子,仅提供构造函数/析构函数,声明变量成员并将基类声明为友元。对派生类的变量成员进行操作的所有方法都在基类中定义。
2)。使用基类创建他/她自己的扩展。这种方法还允许用户引入他们自己的方法来操作相同的变量成员。
设计仅强制执行单级继承。
我的问题主要是关于第 2 条。在当前的实现中,用户必须隐式定义所有构造函数(即描述类的动态变量成员的内存分配的完整过程等)。
问题
下面的示例演示了对使用 CRTP 在基类构造函数中提供派生类的堆变量的内存分配定义的可能性的调查。
基类的一部分
template<class TLeafType, class MyClass> class sysBaseDiscreteTrajectoryPoint {
...
//one of the base constructors
sysBaseDiscreteTrajectoryPoint(const MyClass& MyClassInstance) {
std::cout << "Base additional constructor called" << std::endl;
std::cout << asLeaf().Point << std::endl;
asLeaf().Point=new MyClass(MyClassInstance);
std::cout << asLeaf().Point << std::endl;
}
TLeafType& asLeaf(void) {
return static_cast<TLeafType&>(*this);
}
...
};
派生类:
template<class MyClass>
class sysDiscreteTrajectoryPoint: public sysBaseDiscreteTrajectoryPoint<sysDiscreteTrajectoryPoint<MyClass>, MyClass> {
...
friend class sysBaseDiscreteTrajectoryPoint<sysDiscreteTrajectoryPoint<MyClass>, MyClass>;
private:
MyClass* Point;
public:
sysDiscreteTrajectoryPoint(const MyClass& MyClassInstance): sysBaseDiscreteTrajectoryPoint<sysDiscreteTrajectoryPoint<MyClass>, MyClass>(MyClassInstance){
std::cout << "Derived additional constructor called " << std::endl;
std::cout << Point << std::endl;
std::cout << *Point << std::endl;
}
...
}
主要的:
int a(5);
sysDiscreteTrajectoryPoint<int> A(a);
该代码产生以下输出:
Base additional constructor called
0x847ff4
0x8737008
Derived additional constructor called
0x8737008
5
Derived destructor called
Base destructor called
输出表明该概念可能是可行的。但是,我有两个问题。
1)。我想确保我了解代码执行期间发生的所有过程。特别是,我对流程的效率感兴趣,因为我可能需要从上面介绍的类中实例化大量对象,并且我想了解会发生什么Point
(是否有任何隐藏的重新定义?)
2)。这个问题与使用库boost
为派生类的成员定义智能指针有关。当我尝试用 替换原始指针时boost::shared_ptr
,在尝试通过基类为派生类的成员分配内存时收到分段错误错误。代码的重要部分如下所示。
基类的一部分:
template<class TLeafType, class MyClass> class sysBaseDiscreteTrajectoryPoint {
...
//one of the base constructors
sysBaseDiscreteTrajectoryPoint(const MyClass& MyClassInstance) {
std::cout << "Base additional constructor called" << std::endl;
std::cout << asLeaf().Point << std::endl;
asLeaf().Point.reset(new MyClass(MyClassInstance));
std::cout << asLeaf().Point << std::endl;
}
TLeafType& asLeaf(void) {
return static_cast<TLeafType&>(*this);
}
...
};
部分派生类:
template<class MyClass>
class sysDiscreteTrajectoryPoint: public sysBaseDiscreteTrajectoryPoint<sysDiscreteTrajectoryPoint<MyClass>, MyClass> {
...
friend class sysBaseDiscreteTrajectoryPoint<sysDiscreteTrajectoryPoint<MyClass>, MyClass>;
private:
boost::shared_ptr<MyClass> Point;
public:
sysDiscreteTrajectoryPoint(const MyClass& MyClassInstance): sysBaseDiscreteTrajectoryPoint<sysDiscreteTrajectoryPoint<MyClass>, MyClass>(MyClassInstance){
std::cout << "Derived additional constructor called " << std::endl;
std::cout << Point << std::endl;
std::cout << *Point << std::endl;
}
...
}
主要的:
int a(5);
sysDiscreteTrajectoryPoint<int> A(a);
该代码产生以下输出:
Base additional constructor called
0x28d324
Segmentation fault
我也试过了scoped_ptr
。但是,它在运行时失败,但出现了不同的错误:
Base additional constructor called
*** glibc detected *** ./TestSystem: free(): invalid pointer: 0x00d3fff4 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x6b961)[0xc4e961]
...
我假设它与boost智能指针的操作细节有关。有谁知道如何解决这个问题?