C++ 抽象类成员可以';派生类中的t访问值集
我有以下抽象类C++ 抽象类成员可以';派生类中的t访问值集,c++,g++,C++,G++,我有以下抽象类 class Language { const std::string name ; protected: std::string cmd, home ; Config::Section cfg ; bool load_conf() { home = env("HOME") ; // DEBUG std::cout << home << std::endl ;
class Language {
const std::string name ;
protected:
std::string cmd, home ;
Config::Section cfg ;
bool load_conf() {
home = env("HOME") ;
// DEBUG
std::cout << home << std::endl ;
std::cout << name << std::endl ;
if (!cfg.load(home + "/.cr", name)) {
std::cerr << "cr: No configuration found for this language." << std::endl ;
return false ;
}
return true ;
}
public:
virtual bool handles(const std::string) = 0 ;
virtual int run(std::string) = 0 ;
} ;
我遇到的问题是在load_conf()
中,由于某种原因,name
报告为空,这使得即使配置良好,它也会抛出一个错误load_conf()
从每个派生类实现的run()
调用
我试着把命名为受保护的和公开的,但两者似乎都没有任何区别。理想情况下,我只想在抽象类(受保护)中声明name
,而不必在每个派生类中重复声明,但当我尝试时,它不会编译。我也尝试过使用this->name
,但那也是空的,删除const
也没什么区别
我觉得这是一个范围问题,但我缺少什么呢?在基类中声明一个构造函数,它接受一个参数,即初始化名称的值,并将其传递到派生的构造函数中
以下是一个例子:
class Language {
const std::string name ;
};
class Python : public Language {
const std::string name ; // <-- this is different, and frankly redundant
};
类语言{
常量std::字符串名称;
};
类Python:公共语言{
const std::string name;//在基类中声明一个构造函数,该构造函数接受一个参数,即初始化name
并将其传递给派生的构造函数的值
以下是一个例子:
class Language {
const std::string name ;
};
class Python : public Language {
const std::string name ; // <-- this is different, and frankly redundant
};
类语言{
常量std::字符串名称;
};
类Python:公共语言{
const std::string name;//当您在load_conf()
中引用name
时,在基类Language
中已经有一个名为name
的变量,而不是派生类name
变量
简单的解决方案是为两个变量分别命名或
将基类中的名称
设为受保护
,以便每个派生类都可以引用此变量。当您在加载配置()中引用名称
时,基类中已经有一个名为名称
的变量
编译器引用基类name
变量,而不是派生类name
变量
简单的解决方案是为两个变量分别命名或
将基类中的名称
设为受保护
,以便每个派生类都可以引用此变量。在类Python中
覆盖的是名称
字段,该字段不是加载配置
引用的字段
使用语言将name
设为受保护的classprotected
并删除其子类中的一个,它应该可以正常工作。在类Python
中,您正在覆盖name
字段,该字段不是load\u conf
引用的字段
使用语言类protected
创建名称
,并删除其子类中的一个,它应该可以正常工作
class Language {
const std::string name ;
Language(std::string some_name) : name(some_name) {} // <-- set the name
};
class Python : public Language {
Python() : Language("python") {} // construct the base with the name...
};