我想不出标题的更好的措辞,所以它有点误导,但是,我不是在谈论一个孩子访问从其父级继承的变量,这很容易.
我所说的是这个:
class Parent {
protected:
Parent *target;
int hp;
}
class Child : public Parent {
public:
void my_func();
}
void Child::my_func() {
target->hp -= 50;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试编译它,它会抱怨'hp'在这种情况下是"私有的".问题是孩子没有试图访问自己的父变量,而是其他一些类',这可能是也可能不是Child本身.
一个对象可以访问同一个类的另一个对象(内存中的两个独立实例)的所有变量和方法(公共的,受保护的或私有的),所以我认为它也适用于它,因为它继承自它试图访问的变量类,但似乎我认为这是错误的.
有小费吗?
PS不要粗鲁或任何东西,但我知道我可以创建get()和set()方法,但我希望有一个更清洁的方式.
编辑:我有很多答案告诉我,我应该将删除分成另一个循环.也许我没有说清楚,但我在上一段中说过,我想找到一个解决方法.即保持当前的代码结构,但使用一些鲜为人知的C++ fu来使其工作.
好吧,我知道调用erase()一个向量会使元素的迭代器和它之后的所有迭代器失效,并且erase()会将迭代器返回到下一个有效的迭代器,但是如果擦除发生在其他地方呢?
我有以下情况(简化):
警告:不要认为这是整个代码.下面显示的内容非常简单,以说明我的问题.下面显示的所有类和方法实际上要复杂得多.
class Child {
Parent *parent;
}
class Parent {
vector<Child*> child;
}
void Parent::erase(Child* a) {
// find an iterator, it, that points to Child* a
child.erase(it);
}
int Child::update() {
if(x()) parent.erase(*this) // Sometimes it will; sometimes (most) it won't
return y;
}
void Parent::update() {
int i = 0;
for(vector<A>::iterator it = child.begin(); it != child.end(); it++)
i += (*it)->update();
}
Run Code Online (Sandbox Code Playgroud)
因此,很明显,(*it)->update()如果x()返回true ,它会在运行后崩溃,因为当它执行时,Child会告诉Parent将它从向量中移除,使迭代器无效.
有没有什么方法可以解决这个问题,而不是让Parent::erase() …
问题是:尝试编译时,我不断收到未实现的纯虚拟方法错误。我已经在抽象基类中实现了所有纯虚方法。有任何想法吗?
这是抽象基类:
class record{
public:
virtual int getID()=0;
virtual record *clone();
};
Run Code Online (Sandbox Code Playgroud)
和实施:
class sdata: public record{
public:
sdata(std::string s = ""){data=s; ID=atoi(data.substr(0,8).c_str());}
virtual int getID(){return ID;}
private:
std::string data;
int ID;
};
Run Code Online (Sandbox Code Playgroud)
抱歉,这是完整的错误消息:
“record”中未实现的纯虚拟方法“getID”
也许这段代码导致了错误:
int hashTable::hash(record *x) {
return floor(m * (x->getID() * A - floor(x->getID() * A)));
}
Run Code Online (Sandbox Code Playgroud) 我用函数式风格编写了这段 JavaScript 代码:
\n\nsomeArray\n .filter((element) => element)\n .map((element) => element.property)\n .map((property) => doSomethingWithIt)\nRun Code Online (Sandbox Code Playgroud)\n\n现在,na\xc3\xafve 实现将在数组上循环三次 \xe2\x80\x94,每个filter和map\xe2\x80\x94 一次,但是优化器应该能够将其优化为执行多个操作的一个循环,假设所有函数是纯粹的。
(大多数?)JavaScript 引擎是否对此进行了优化?还是需要手动优化?
\n\n编辑:我认为优化的是将其减少到一个循环:
\n\nsomeArray.reduce((acc, element) => {\n if(!element) {\n return acc\n }\n\n return acc.push(doSomethingWithIt(element.property))\n}, [ ])\nRun Code Online (Sandbox Code Playgroud)\n 我使用Autoconf相对较新,到目前为止我只使用过PKG_CHECK_MODULES,这对我有用.我遇到了一个包,特别是Debian libmhash-dev v0.9.9.9-1,它不包含要使用的.pc文件pkg-config.
如何告诉Autoconf检查mhash并将正确的标志传递给g ++?
我有以下情况.
这是一个代码片段,经过编辑以证明问题.
ifstream ifs("empty_file");
if(!ifs.is_open()) {
ui.display("Error: Unable to open file \"empty_file\"\n");
return;
}
archive::text_iarchive ia(ifs);
try {
ia >> some_class;
} catch (...) {
ui.display("This should catch ever single exception\n");
}
Run Code Online (Sandbox Code Playgroud)
empty_file确实是一个完全空的文件.这应该会导致错误; 它确实如此.问题是我无法捕获boost引发的异常并滥用用户给我一个空/损坏的文件加载.
相反,我得到以下内容:
Loading...
terminate called after throwing an instance of 'boost::archive::archive_exception'
what(): invalid signature
Aborted
Run Code Online (Sandbox Code Playgroud)
据我所知,catch(...)应该捕获存在的每个异常.我做错了什么,或者是boost :: serialization只是抓住自己的异常并在我有机会做任何事情之前中止()ing?
如果是后者,那么它只是我还是那个非常糟糕的设计?您的整个程序不应该只是从损坏的加载文件崩溃(abort()ing).我能做些什么呢?
目前,vim public:像我这样对齐:
class foo {
public:
void bar();
}
Run Code Online (Sandbox Code Playgroud)
也就是说,之前有两个空格public:,然后是一个完整的标签(在我的情况下是三个空格).
我如何让它对齐:
class foo {
public:
void bar();
}
Run Code Online (Sandbox Code Playgroud)
正如在void bar();缩进中只有一个标签(三个空格),并且public:是"中途"(或一个空格)?
c++ ×5
archive ×1
autoconf ×1
boost ×1
d ×1
exception ×1
inheritance ×1
iterator ×1
javascript ×1
libraries ×1
performance ×1
pure-virtual ×1
vim ×1