我认为这是一个非常简单的问题,但我不太了解C ++,听起来很简单。
我有定义抽象基类ContinuousDistribution
的代码,以及Cauchy
或Normal
等派生类。
我的目标是拥有变量A
的默认定义,但允许用户更改该定义,特别是更改变量的类型。
(我不是指运行时重新定义,它是编译时重新定义)
所以在默认文件中我会有
default.cpp
...
Normal A(0., 20.); // Normal is the default
....
x = A.logpdf();
编译并运行,假设默认Normal
分布。
然后我希望用户创建一个“配置”文件,其中可以更改A
的定义。在另一个文件中,将与 default.cpp
一起编译,我们可以
user1.cpp
...
Normal A(0., 10.); // change the arguments of Normal
....
call some functions defined in default.cpp, which use methods of A
....
或另一个
user2.cpp
...
Cauchy A(0., 10.); // change the type of A
....
call some functions defined in default.cpp, which use methods of A
....
要解决此问题,我尝试在extern Normal A
中使用default.cpp
,但这不允许将变量重新定义为Cauchy
。
我还尝试使用extern ContinuousDistribution A
中的default.cpp
,但这也无效。
如果A
的定义已从default.cpp
中移除,则我无法使用error: ‘A’ was not declared in this scope
进行编译,因为我使用了A.logpdf()
。
我该如何解决这个问题?
正如评论中所建议的那样,我也尝试使用指针
Normal *A=new Normal(0,20);
中的default.cpp
并在A = new Cauchy(0,10);
中将其与user2.cpp
重新分配,但user2.cpp
无法编译,因为A was not declared in this scope
。
答案 0 :(得分:0)
如果你使用标题(这是一个很好的做法,所以你应该这样做),你可以按如下方式进行:
<强> default.h 强>
#ifndef _default_h_
extern Normal *A;
#define _default_h_
#endif
<强> default.cpp 强>
#include "default.h"
...
Normal *A = new Normal(0., 20.); // Normal is the default
....
x = A->logpdf();
...
<强> user1.cpp 强>
#include "default.h"
...
delete A; // Free up memory
A = new Normal(0., 10.); // change the arguments of Normal
...
call some functions defined in default.cpp, which use methods of A
....
<强> user2.cpp 强>
#include "default.h"
...
delete A; // Free up memory
A = new Cauchy(0., 10.); // change the arguments of Normal
...
call some functions defined in default.cpp, which use methods of A
....
Extern关键字告诉编译器在链接阶段会有某个给定类型和名称的变量,并且使用基类指针允许存储衍生物本身。