小编bad*_*000的帖子

C++ 11引用类型的成员变量,矢量push_back后的不同行为

当我把它推入一个向量时,我正在使用其他人的课程.它涉及一个成员变量,它是对另一个成员变量的引用.这是最小的自包含示例:

#include <iostream>
#include <vector>

class Myclass {
public: 
  Myclass() : a(1.0) {}

  float a;
  float &a_ref = a;

  void addOne() {
    a = a + 1.0;
  }
};

int main() {
  Myclass instance1;
  instance1.addOne();

  //prints 2:
  std::cout << "instance.a_ref is " << instance1.a_ref << std::endl;

  std::vector<Myclass> vec;
  Myclass instance2;
  vec.push_back(instance2);

  vec.at(0).addOne();

  //prints 1;
  std::cout << "vec.at(0).a_ref is " << vec.at(0).a_ref << std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我是用汇编g++-std=c++11,所以我没有注意到一会儿这个问题.我现在看到问题可能与合成的复制构造函数和引用成员有关.但我不确定的是:

  1. 当对象在向量中时,为什么会有不同的行为?
  2. 为什么不g++使用c ++ 11标准给出任何警告?

奖金问题,因为我很好奇:

  1. 什么是首先初始化,a …

c++ reference vector member c++11

16
推荐指数
2
解决办法
757
查看次数

makefile“strip”功能不起作用

我想在 makefile 中定义一个变量,它应该是项目中所有文件依赖项的列表,用一个空格分隔。我这样做是:

DEP_LIST = $(shell g++ -M $(SRC_FILES) $(INC_DIRS))
Run Code Online (Sandbox Code Playgroud)

它输出我的所有项目依赖项,例如:

main.o: src/main.cpp /usr/include/stdc-predef.h   /usr/include/c++/4.8/iostream   /usr/include/x86_64-linux-gnu/c++/4.8/bits/c++config.h ...
Run Code Online (Sandbox Code Playgroud)

我过滤掉这些xxx.o:

DEP_LIST_FILTERED = $(filter-out %.o:, $(DEP_LIST))
Run Code Online (Sandbox Code Playgroud)

现在输出

src/main.cpp /usr/include/stdc-predef.h  /usr/include/c++/4.8/iostream  /usr/include/x86_64-linux-gnu/c++/4.8/bits/c++config.h ...
Run Code Online (Sandbox Code Playgroud)

到目前为止看起来不错,现在我只需要使用以下方法去除双空格:

DEP_LIST_STRIPPED = $(strip $(DEP_LIST_FILTERED))
Run Code Online (Sandbox Code Playgroud)

但这没有任何效果,输出与之前的相同。大概这与我的 shell (bash) 处理空格的方式有关,但我找不到任何有关它的信息。有任何想法吗?

编辑:如果相关,我需要删除双空格的原因是我想将列表传递给表单中的 ctags

ctags $(DEP_LIST_STRIPPED) -{options}
Run Code Online (Sandbox Code Playgroud)

但在目前的形式中,它抱怨:

ctags: Warning: cannot open source file " /usr/include/c++/4.8/iostream" : No such file or directory
Run Code Online (Sandbox Code Playgroud)

bash makefile

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

gtkmm 3 windows 64 bit

我不认为有人设法为Windows 64位构建gtkmm 3,或者知道一个好的构建?

谷歌有大约3-4个链接,人们已经尝试过,但由于各种原因,我无法让他们中的任何一个工作.pkg-config文件丢失了(所以我无法编译任何程序),或者我收到incompatible .dll.a样式错误消息,或者程序崩溃了.

我自己尝试构建它并失败,因为我认为我没有足够的经验,我尝试在gtkmm邮件列表上询问,没有人回复.有官方的win64安装程序,但仅适用于gtkmm 2.

c++ windows gtk gtkmm

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

C++允许重新定义全局(const)变量?

我对全局常量有点困惑.我(初学者级别)的理解是'全局'变量是在块之外定义的并且具有程序范围(来源:http://www.learncpp.com/cpp-tutorial/42-global-variables/).但该计划:

#include <iostream>

const double x=1.5;

int main(){
        std::cout << "1) x=" << x << std::endl;
        double x=2.5;
        std::cout << "2) x=" << x << std::endl;
        //const double x=3.5;
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用-Wall编译g ++(GCC,最新的64位版本),没有任何问题.

输出:

1) x=1.5
2) x=2.5
Run Code Online (Sandbox Code Playgroud)

这对我来说很困惑.第一个cout评估的事实意味着main将'x'识别为'全局'变量(它未在main的范围中定义).如果是这样的话,为什么让我重新定义'x'?

然后,如果取消注释注释的第三个声明,g ++会引发重新声明错误.意思是,我的第一个宣言不能是'全球',在我定义的意义上:S

编辑:好的,问题与全局变量无关,但是范围:例如http://pastebin.com/raw.php?i=V5xni19M中的相同问题

c++ global const redeclaration

2
推荐指数
1
解决办法
2337
查看次数

标签 统计

c++ ×3

bash ×1

c++11 ×1

const ×1

global ×1

gtk ×1

gtkmm ×1

makefile ×1

member ×1

redeclaration ×1

reference ×1

vector ×1

windows ×1