目前我从 Java 切换到 C++,这让我很难过(但有很多新经验 ^^)。我正在编写一些包含我的程序配置的数据传输对象。我已经写了一些类,现在我想要一个行为像容器的类。
这是容器的 header :
class MyContainer{
public:
MyContainer();
virtual ~MyContainer();
Config getConfig(TypeEnum type) {
switch (type) {
case ATYPE:
return config_a;
case BTYPE:
return config_b;
default:
break;
}
}
ConfigA config_a;
ConfigB config_b;
};
配置文件中包含一些数据,并且派生自另一个配置文件。
这是 C++ 源代码:
MyContainer::MyContainer(){
ConfigA config_a(int c = 1);
ConfigB config_b(double b = 2.1);
this->config_a = config_a;
this->config_b = config_b;
}
我觉得有几个问题。但对我来说主要的问题是: 我怎样才能在这个容器中获取这些配置以将其共享到我程序的其他模块?我试图将 config_a 设置为一个指针,但我总是收到这些类型不匹配的错误消息。
this->config_a = &config_a; //If ConfigA config_a; was ConfigA *config_a; instead
如果你有时间给我,请告诉我 getConfig
方法是否可以像这样工作。
如果还有其他主题,请分享。谢谢。
最佳答案
如果您在 header 中写入
ConfigA configA
,则在分配容器类时会自动分配configA。所以你不必像下面这样初始化它:ConfigA config_a(1); this->config_a = config_a;
相反,您可以执行以下操作:
this->config_a->value = 1;
不需要写:
ConfigA config_a(int c = 1);
简而言之,上面提到的
int c = 1
是一个操作,它:- 为临时变量 c 在堆上分配空间(这也可以在进入方法时完成)
- 给它赋值,它有返回右边值的副作用
- 返回的右侧值应用于 ConfigA 构造函数。
要了解这一点,请尝试以下操作:
int a, b, c; c = (a = 2) + (b = 8); printf("a = %d, b = %d, c = %d\n", a, b, c);
如果您想将配置传递给其他模块,您可以选择以下解决方案之一:
a) 接受配置作为引用(配置类必须派生自相同的基类):
ConfigA & configA = dynamic_cast<ConfigA &>(container.get_config(ATYPE));
在这种情况下,容器将通过以下方式返回配置:
return this->configA;
但是header要修改:
Config & getConfig(TypeEnum type) { (...)
b) 接受配置作为指针(同上)
ConfigA * configA = dynamic_cast<ConfigA *>(container.get_config(ATYPE));
在这种情况下,容器将通过以下方式返回配置:
return &(this->configA);
最后,我会这样做:
class ConfigA
{
private:
int i;
public:
int GetI() const { return i; }
void SetI(int newI) { i = newI; }
};
class ConfigB
{
private:
float f;
public:
float GetF() const { return f; }
void SetF(float newF) { f = newF; }
};
class Config
{
private:
ConfigA configA;
ConfigB configB;
public:
ConfigA & GetConfigA() { return configA; }
ConfigB & GetConfigB() { return configB; }
};
class AppContext
{
private:
Config config;
public:
Config & GetConfig() { return config; }
};
// Somewhere in the code
Config & config = context.GetConfig();
ConfigA & configA = config.GetConfigA();
configA.SetI(44);
const-correctness 也值得一提,但我们将把它留作 OP 的练习 ;)
关于C++ 容器类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14122639/