我试图读取文件并将其存储在受保护的变量中。所有方法都属于同一类。
class A: public B
{
public:
//method declarations
protected:
string d;
};
void A::l(std::string filename)
{
ifstream ifs;
ifs.open(filename);
string d { istreambuf_iterator<char> {ifs}, istreambuf_iterator<char> {} };
ifs.close();
}
void A::f(void)
{
std::cout << d.length() << std::endl;
}
当我尝试打印字符串的长度时,它为0.当我尝试在f()中打印d
时,不会打印任何内容。我需要d
成为受保护的变量,我也无法更改方法。如何将读取文件字符串传递给f
方法?
答案 0 :(得分:1)
您已分配到本地,请使用该成员(此处@Component({
selector: 'error-desc',
template: '<h1>Error page = {{code}}</h1>'
changeDetection: ChangeDetectionStrategy.OnPush
})
export class ErrorComponent implements OnInit {
public code: string = '';
constructor(
) {}
ngOnInit() {
// not called
this.code="AAAA";
console.log("OnInit");
}
ngOnDestroy() {
console.log("OnDestroy");
}
}
是可选的):
this->
如果这没有帮助,您可能错误地指定了文件名。
尝试绝对路径(例如/home/user/file.txt或C:\ Documents \ User \ Documents \ file.txt)或检查程序的工作目录。
您始终可以检查错误:
this->d.assign(istreambuf_iterator<char> {ifs}, {});
答案 1 :(得分:0)
您的问题与您的变量受到保护无关。问题是您要定义另一个具有相同名称的变量。为了避免这个问题,有些人在变量的名称后附加一个下划线,比如'd_',其他人写'm_d'。但如果你不想这样做,你就不需要这样做。
执行您要执行的操作的一种方法如下:
class A
{
public:
void l(std::string filename);
void f();
//method declarations
protected:
string d;
};
void A::l(std::string filename)
{
ifstream ifs{filename};
if(!ifs)
return; // error
std::copy(istreambuf_iterator<char>{ifs},
istreambuf_iterator<char>{},
std::back_inserter(d)); // this is A::d
}
您不需要使用'this-&gt;'。实际上在C ++中你永远不会使用'this'(仅限于'return * this'这样的句子)。
另外,在C ++中你不写:
void f(void);
但是,你写了
void f();
而且你也不需要关闭ifstream。析构函数会为你做这件事。