小编Inf*_*tor的帖子

访问父级的受保护变量

我想不出标题的更好的措辞,所以它有点误导,但是,我不是在谈论一个孩子访问从其父级继承的变量,这很容易.

我所说的是这个:

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++

21
推荐指数
2
解决办法
3万
查看次数

在erase()之后保持有效的vector :: iterator

编辑:我有很多答案告诉我,我应该将删除分成另一个循环.也许我没有说清楚,但我在上一段中说过,我想找到一个解决方法.即保持当前的代码结构,但使用一些鲜为人知的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() …

c++ iterator

11
推荐指数
2
解决办法
6617
查看次数

未实现的纯虚拟方法?

问题是:尝试编译时,我不断收到未实现的纯虚拟方法错误。我已经在抽象基类中实现了所有纯虚方法。有任何想法吗?

这是抽象基类:

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)

c++ inheritance abstract-class pure-virtual

6
推荐指数
1
解决办法
3万
查看次数

JavaScript 是否优化多个纯过滤器/映射/等?

我用函数式风格编写了这段 JavaScript 代码:

\n\n
someArray\n  .filter((element) => element)\n  .map((element) => element.property)\n  .map((property) => doSomethingWithIt)\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在,na\xc3\xafve 实现将在数组上循环三次 \xe2\x80\x94,每个filtermap\xe2\x80\x94 一次,但是优化器应该能够将其优化为执行多个操作的一个循环,假设所有函数是纯粹的。

\n\n

(大多数?)JavaScript 引擎是否对此进行了优化?还是需要手动优化?

\n\n

编辑:我认为优化的是将其减少到一个循环:

\n\n
someArray.reduce((acc, element) => {\n  if(!element) {\n    return acc\n  }\n\n  return acc.push(doSomethingWithIt(element.property))\n}, [ ])\n
Run Code Online (Sandbox Code Playgroud)\n

javascript performance compiler-optimization

6
推荐指数
1
解决办法
490
查看次数

当没有.pc文件时,让Autoconf手动检查库

我使用Autoconf相对较新,到目前为止我只使用过PKG_CHECK_MODULES,这对我有用.我遇到了一个包,特别是Debian libmhash-dev v0.9.9.9-1,它不包含要使用的.pc文件pkg-config.

如何告诉Autoconf检查mhash并将正确的标志传递给g ++?

configuration autoconf libraries

5
推荐指数
1
解决办法
593
查看次数

捕获提升序列化归档例外

我有以下情况.

这是一个代码片段,经过编辑以证明问题.

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).我能做些什么呢?

c++ serialization boost exception archive

5
推荐指数
1
解决办法
3160
查看次数

Vim:公共关键字的对齐方式

目前,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++ vim d

4
推荐指数
1
解决办法
972
查看次数