C++ 抽象 class 方法中的指针
C++ Abstract class pointer in method
所以我有一个正在处理的 c++ 项目,我试图理解其他人的代码,但我得到的只是关于 c++ 抽象的错误和困惑 classes.
所以我有一个头文件一个cpp文件和一个主程序。
我想创建一个抽象的 class 指针,然后将它传递给一个将其初始化为子class 的方法,然后回到主程序中我可以将它用作子class:
main.cpp:
#include "a.h"
#include <iostream>
using namespace std;
void parse(A* a){
a = new B();
a->foo();
}
int main() {
A* a;
parse(a);
a->foo();
}
a.h:
class A{
public:
virtual void foo() const = 0;
virtual ~A(){ }
};
class B : public A{
public:
void foo() const override;
};
class C : public A{
public:
void foo() const override;
};
a.cpp
#include <iostream>
#include "a.h"
void B::foo() const{
std::cout << "B" << std::endl;
}
void C::foo() const{
std::cout << "C" << std::endl;
}
基本上在这里我想我应该得到一个 B 但是我得到一个 分段错误 或者程序 退出 没有打印任何东西。
感谢您的帮助!
主要是你有未初始化的指针a
int main() {
A* a;
parse(a);
a->foo();
}
所以这个声明
a->foo();
导致未定义的行为。
至于函数解析
void parse(A* a){
a = new B();
a->foo();
}
然后处理它的局部变量a
。更改局部变量不会影响在 main 中声明的原始指针。
您需要将参数声明为具有引用类型
void parse(A* &a){
a = new B();
a->foo();
}
在这种情况下,main中声明的指针a将通过引用传递给函数,函数将更改原始指针a。
除了 Vlad 中描述的未定义行为问题外,您的示例还会泄漏内存,即使 main
中的指针已正确初始化。
我推荐一个替代解决方案。我建议不要使用拥有裸指针,而不是通过引用修改指针。相反,return 指针,并使用智能指针作为所有权:
std::unique_ptr<A>
parse(){
auto a = std::make_unique<B>;
a->foo();
return a;
}
int
main() {
auto a = parse();
a->foo();
}
所以我有一个正在处理的 c++ 项目,我试图理解其他人的代码,但我得到的只是关于 c++ 抽象的错误和困惑 classes.
所以我有一个头文件一个cpp文件和一个主程序。
我想创建一个抽象的 class 指针,然后将它传递给一个将其初始化为子class 的方法,然后回到主程序中我可以将它用作子class:
main.cpp:
#include "a.h"
#include <iostream>
using namespace std;
void parse(A* a){
a = new B();
a->foo();
}
int main() {
A* a;
parse(a);
a->foo();
}
a.h:
class A{
public:
virtual void foo() const = 0;
virtual ~A(){ }
};
class B : public A{
public:
void foo() const override;
};
class C : public A{
public:
void foo() const override;
};
a.cpp
#include <iostream>
#include "a.h"
void B::foo() const{
std::cout << "B" << std::endl;
}
void C::foo() const{
std::cout << "C" << std::endl;
}
基本上在这里我想我应该得到一个 B 但是我得到一个 分段错误 或者程序 退出 没有打印任何东西。
感谢您的帮助!
主要是你有未初始化的指针a
int main() {
A* a;
parse(a);
a->foo();
}
所以这个声明
a->foo();
导致未定义的行为。
至于函数解析
void parse(A* a){
a = new B();
a->foo();
}
然后处理它的局部变量a
。更改局部变量不会影响在 main 中声明的原始指针。
您需要将参数声明为具有引用类型
void parse(A* &a){
a = new B();
a->foo();
}
在这种情况下,main中声明的指针a将通过引用传递给函数,函数将更改原始指针a。
除了 Vlad main
中的指针已正确初始化。
我推荐一个替代解决方案。我建议不要使用拥有裸指针,而不是通过引用修改指针。相反,return 指针,并使用智能指针作为所有权:
std::unique_ptr<A>
parse(){
auto a = std::make_unique<B>;
a->foo();
return a;
}
int
main() {
auto a = parse();
a->foo();
}