C++ 未定义对动态创建 Class 成员函数的引用
C++ Undefined Reference to Function of Dynamically Created Class Member
我有四种不同的 C++ 类; Comp()
,其中包含Parent()
,其中有两个childrenChildA()
和ChildB()
。我想根据某些参数在 Comp()
内部动态创建 ChildA
或 ChildB
的实例。
我的代码看起来有点像这样:
class Parent {
public:
foo();
};
class ChildA : public Parent {
public:
foo(); // Overrides Parent.foo()
};
class ChildB : public Parent {
public:
foo(); // Overrides Parent.foo()
};
class Comp {
public:
Init(uint8_t someParam){
if(someParam){
obj = new ChildA();
}
else{
obj = new ChildB();
}
}
doFoo(){
obj->foo();
}
private:
Parent* obj;
};
但是,这不会编译。它向我抛出链接器错误,说我有一个未定义的引用 Parent::foo()
/build/libComp.a(Comp.cpp.o): In function `Comp::doFoo()':
Comp.cpp:(.text._ZN6Memory8readByteEt+0x4e): undefined reference to `Parent::foo()'
我觉得我在这里缺少一些基本的东西。我来自 Python 编程背景,所以我还没有完全将我的思维过程切换到 C++。我可以这样使用 类 吗?
作为一名 Python 程序员,您已经习惯了每个方法都是虚拟方法的世界,重载意味着您只需替换 dict 中的值。 C++ 有点不同。
所以第一个方案就是定义Parent::foo
方法。你已经声明了它,class 不是模板 - 所以你必须在某处定义正文。无论如何,这对您没有帮助,因为调用 obj->foo();
意味着调用 Parent::foo()
方法,我想这不是您想要的。
现在我们进入虚拟方法的世界:在 C++ 中,您必须将方法显式声明为 virtual
:
class Parent {
public:
virtual foo();
};
你还需要在某处定义 Parent::foo()
的正文。
如果你不想通过设计来定义它,你可以使这个方法抽象(因此class Parent
也变得抽象, 并且无法创建此 class 的实例):
class Parent {
public:
virtual foo() = 0;
};
您不需要将派生的 classes 的方法 foo
声明为虚拟的(它们无论如何都会是),但最佳做法是添加一个 override
或 final
说明符:
class ChildA : public Parent {
public:
foo() final; // Overrides Parent.foo()
};
class ChildB : public Parent {
public:
foo() override; // Overrides Parent.foo()
};
区别在于您不能为 ClassA
重写此方法,而您可以为 ClassB
.
重写此方法
我有四种不同的 C++ 类; Comp()
,其中包含Parent()
,其中有两个childrenChildA()
和ChildB()
。我想根据某些参数在 Comp()
内部动态创建 ChildA
或 ChildB
的实例。
我的代码看起来有点像这样:
class Parent {
public:
foo();
};
class ChildA : public Parent {
public:
foo(); // Overrides Parent.foo()
};
class ChildB : public Parent {
public:
foo(); // Overrides Parent.foo()
};
class Comp {
public:
Init(uint8_t someParam){
if(someParam){
obj = new ChildA();
}
else{
obj = new ChildB();
}
}
doFoo(){
obj->foo();
}
private:
Parent* obj;
};
但是,这不会编译。它向我抛出链接器错误,说我有一个未定义的引用 Parent::foo()
/build/libComp.a(Comp.cpp.o): In function `Comp::doFoo()':
Comp.cpp:(.text._ZN6Memory8readByteEt+0x4e): undefined reference to `Parent::foo()'
我觉得我在这里缺少一些基本的东西。我来自 Python 编程背景,所以我还没有完全将我的思维过程切换到 C++。我可以这样使用 类 吗?
作为一名 Python 程序员,您已经习惯了每个方法都是虚拟方法的世界,重载意味着您只需替换 dict 中的值。 C++ 有点不同。
所以第一个方案就是定义Parent::foo
方法。你已经声明了它,class 不是模板 - 所以你必须在某处定义正文。无论如何,这对您没有帮助,因为调用 obj->foo();
意味着调用 Parent::foo()
方法,我想这不是您想要的。
现在我们进入虚拟方法的世界:在 C++ 中,您必须将方法显式声明为 virtual
:
class Parent {
public:
virtual foo();
};
你还需要在某处定义 Parent::foo()
的正文。
如果你不想通过设计来定义它,你可以使这个方法抽象(因此class Parent
也变得抽象, 并且无法创建此 class 的实例):
class Parent {
public:
virtual foo() = 0;
};
您不需要将派生的 classes 的方法 foo
声明为虚拟的(它们无论如何都会是),但最佳做法是添加一个 override
或 final
说明符:
class ChildA : public Parent {
public:
foo() final; // Overrides Parent.foo()
};
class ChildB : public Parent {
public:
foo() override; // Overrides Parent.foo()
};
区别在于您不能为 ClassA
重写此方法,而您可以为 ClassB
.