Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有一种方法可以让你;虚拟的;C+中的变量+;基类?_C++_Oop_C++11 - Fatal编程技术网

C++ 有没有一种方法可以让你;虚拟的;C+中的变量+;基类?

C++ 有没有一种方法可以让你;虚拟的;C+中的变量+;基类?,c++,oop,c++11,C++,Oop,C++11,我有一个带有指针的基类,需要在所有子类的构造函数中进行初始化。如何确保在子类的构造函数中初始化此变量?我基本上想要的功能与制作纯虚拟函数相同,只是需要一个指向对象的指针。有办法吗 我的代码如下所示: A.hpp: A类{ 受保护的: A(); X*指针; }; B.水电站: B类:公共A类{ 公众: B(); }; B.cpp: B::B():A(){ //如何确保指针在此处初始化? } 有没有办法实现这一点?不幸的是,当前的虚拟表不能(可移植地)直接包含“虚拟数据”,即类级通用的元数据

我有一个带有指针的基类,需要在所有子类的构造函数中进行初始化。如何确保在子类的构造函数中初始化此变量?我基本上想要的功能与制作纯虚拟函数相同,只是需要一个指向对象的指针。有办法吗

我的代码如下所示:

A.hpp:

A类{
受保护的:
A();
X*指针;
};
B.水电站:

B类:公共A类{
公众:
B();
};
B.cpp:

B::B():A(){
//如何确保指针在此处初始化?
}

有没有办法实现这一点?

不幸的是,当前的虚拟表不能(可移植地)直接包含“虚拟数据”,即类级通用的元数据

您可以让虚拟方法返回指向某个
X

您也可以使用(在C++11中)。例如,您可以定义一个静态哈希表

static std::unordered_map<std::typeinfo,X*> map;
X* getX() { return map[typeid(this)]; };
static std::无序映射;
X*getX(){returnmap[typeid(this)];};

然后由您适当地填充
映射。

我会将所有数据成员
设置为私有
,因为
受保护
仍然意味着您无法更改接口。使数据成员
私有
还提示如何确保它由派生类提供:为基类提供一个构造函数,该构造函数需要传入一个合适的指针。如果要确保最派生的类在指针中传递,请将基类设为a
virtual
base:

class A {
    X* pointer;
public:
    A(X* p): pointer(p) {}
};

class B
    : public A {
public:
    B(): A(new X) {}
};

更改基类的构造函数:

class A {
protected:
    explicit A(X* pointer);
    X *pointer;
};
因此,儿童必须给予价值,如:

class B : public A {
public:
        B() : A(nullptr) {}
        explicit B(X* x) : A(x) {}
};

只需定义基类构造函数的参数:

class A {
protected:
    A(X* ptr) : pointer(ptr) {}
    X *pointer;
};
然后,派生类需要传递其ctor初始值设定项列表中的值:


如果基类通过一个带有包含初始化值的参数的构造函数来初始化该变量本身就足够了

class A {
protected:
    A( X * thePointer );
    X *pointer;
};
在这种情况下,任何派生类都必须显式调用基类构造函数并指定所需的值

B::B() : A( thePointer ) {
    // how do i make sure pointer gets initialized here?
}

为什么不跳过在基类中存储指针呢?通常的方法是将指针传递到构造函数中,并用它初始化指针。派生构造函数调用基类并将指针传递给它。不需要特殊的机制。你可能想得太多了。只需在A的构造函数中将X初始化为NULL ptr或NULL,然后在派生类的构造函数中正确初始化它。在未初始化X的情况下调用的中的方法中自由地断言。将默认c'tor设为私有,强制派生类调用c'tor并使用指针参数。@IInspectable:如果定义一个使用指针的构造函数,编译器甚至不会生成默认构造函数。“类通用的元数据”不会在构造函数中初始化,因此这不是他想要的。但哪个类负责取消分配?明白了吗?@user2672165:我会说是谁创造了它。这里
X
既不是B也不是A所有。否则,我会将原型更改为采用
std::unique\u ptr
B::B() : A( thePointer ) {
    // how do i make sure pointer gets initialized here?
}