标签: c++

eof()不好的做法?

可能重复:
为什么循环条件中的iostream :: eof被认为是错误的?

所以我使用过eof()的功能在我的很多程序,需要文件输入的,我的教授说,这是蛮好用的,但有几个人在等纷纷表示,我不应该没有真正指定的原因使用它.所以我想知道,有充分的理由吗?

c++ eof

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

错误:无法访问功能

我收到了这个错误,但我认为如果会员的保护级别太高并且无法访问它我只能得到它,但无论如何我都会得到它.

Shopable.h:

#ifndef _SHOPABLE_H_
#define _SHOPABLE_H_

#include "Library.h"

class Shopable{
private:
    std::string Name;
    int Cost;
    std::string Description;
public:
    std::string getName() const{return Name;}
    int getCost() const {return Cost;}
    virtual std::string getDesc() const = 0;
};

#endif
Run Code Online (Sandbox Code Playgroud)

Weapon.h:

#ifndef _WEAPON_H_
#define _WEAPON_H_

#include "Globals.h"
#include "Shopable.h"

class Weapon : Shopable{
private:
    int Damage;
public:
    Weapon(int Cost,int Damage,std::string Name) : Cost(Cost), Damage(Damage), Name(Name){}
    std::string getDesc() const{
        return getName()+"\t"+tostring(Damage)+"\t"+tostring(Cost);
    }
    int Damage(Entity *target){
        int DamageDealt = 0;
        //do damage algorithm things here
        Special();
        return …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance protection

25
推荐指数
5
解决办法
5万
查看次数

使用CMake的Google C++ Testing Framework的最简单示例

我有一个非常简单的C++库(一个头文件,一个.cpp文件).我想使用Google C++测试框架为这个项目编写单元测试.

这是目录结构:

~/project1
 |
 |-- project1.cpp
 |-- project1.h
 |-- project1_unittests.cpp
 \-- CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)

我不打算编写自己的main()函数.我想与引物中提到的gtest_main链接.CMakeLists.txt应该包含什么?

c++ unit-testing cmake googletest

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

如何编程Arduino与标准C不同?

我有编程嵌入式系统的背景(TI MSP430,Atmel ATxmega).如何编程Arduino不同于那些?我可以用什么知识来编写Arduino?

c c++ arduino

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

获取成员变量的大小

如果有一个POD结构,带有一些成员变量,例如:

struct foo
{
   short a;
   int b;
   char c[50];
   // ...
};
Run Code Online (Sandbox Code Playgroud)

有没有办法以字节为单位获取成员变量的大小,而无需创建此类型的对象?

我知道这会奏效:

foo fooObj;
std::cout << sizeof( fooObj.a ) << std::endl;
std::cout << sizeof( fooObj.b ) << std::endl;
std::cout << sizeof( fooObj.c ) << std::endl;
Run Code Online (Sandbox Code Playgroud)

以下内容是否会被编译器优化并阻止构造对象?

std::cout << sizeof( foo().a ) << std::endl;
Run Code Online (Sandbox Code Playgroud)

c++ c++11

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

使用可变参数模板创建静态数组

stackoverflow上有一个答案(我似乎无法再找到它),它演示了如何在C++ 11中使用可变参数模板在编译时创建静态数组:

template <class T, T... args> 
struct array_
{
    static const T data[sizeof...(args)];
};

template <class T, T... args> 
const T array_<T, args...>::data[sizeof...(args)] = { args... };
Run Code Online (Sandbox Code Playgroud)

可以提供递归元函数以array_使用任意数量的参数进行实例化,然后将这些参数在编译时复制到内部数组中.这是创建元函数以在编译时生成常量数组的有用方法.

但是,一个问题是它依赖于类模板参数来获取填充数组的实际值.这导致一个主要限制:只有积分常数可以用作值模板参数.因此,您无法使用此技术生成自定义类型的数组.

我试着想办法解决这个限制,但不能提出任何建议.有没有办法让这种技术适用于非积分常数?

c++ templates variadic-templates c++11

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

(重新)命名为std :: pair成员

而不是写town->first我想写town->name.内联命名访问器(重命名地图迭代器命名std :: pair成员的第一个和第二个)是我到目前为止找到的最佳解决方案.我对命名访问器的问题是类型安全性的丢失: pair<int,double>可能是指struct { int index; double value; }或者struct { int population; double avg_temp; }.任何人都可以提出一个简单的方法,也许类似于特征?

我经常想从一个函数返回一对或一个元组,struct city { string name; int zipcode; }每次引入一个类似的新类型和它的ctor 是非常累人的.我很高兴了解boost和C++ 0x但我需要一个没有提升的纯C++ 03解决方案.

更新

Re andrewdski的问题:是的,一个(假设的)语法就像pair<int=index, double=value>创建一个不同的类型来pair<int=population, double=avg_temp>满足你的要求.我甚至不介意实现一个自定义的对/元组模板类ONCE,只是当我需要一个新类型时,只是将'name traits'模板参数传递给它.我不知道'名称特征'会是什么样子.也许这是不可能的.

c++ templates stl typedef traits

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

有没有办法为C或C++结构强制执行特定的字节序?

我已经看到了关于结构的字节序的一些问题和答案,但它们是关于检测系统的字节序,或者在两个不同的字节序之间转换数据.

但是,如果有一种方法可以强制执行给定结构的特定字节顺序,那么我现在想要的是什么.是否有一些好的编译器指令或其他简单的解决方案,除了重写操作在位域上的很多宏的整个事情?

一般的解决方案会很好,但我也会对特定的gcc解决方案感到满意.

编辑:

感谢所有评论指出为什么强制执行endianness不是一个好主意,但在我的情况下,这正是我需要的.

特定处理器生成大量数据(永远不会改变,它是带有自定义硬件的嵌入式系统),并且必须由在未知处理器上运行的程序(我正在处理)读取.对数据进行字节评估会非常麻烦,因为它包含数百种不同类型的结构,这些结构非常庞大且深入:它们中的大多数都有许多其他巨大的结构层.

改变嵌入式处理器的软件是不可能的.源是可用的,这就是为什么我打算使用该系统的结构而不是从头开始并按字节方式评估所有数据.

这就是为什么我需要告诉编译器它应该使用哪个字节序,无论效率与否都无关紧要.

它不一定是字节序的真正变化.即使它只是一个接口,物理上所有东西都是在处理器自己的字节序中处理的,但我完全可以接受.

c c++ endianness low-level

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

当二元运算符两边的签名不同时,促销规则如何工作?

考虑以下程序:

// http://ideone.com/4I0dT
#include <limits>
#include <iostream>

int main()
{
    int max = std::numeric_limits<int>::max();
    unsigned int one = 1;
    unsigned int result = max + one;
    std::cout << result;
}
Run Code Online (Sandbox Code Playgroud)

// http://ideone.com/UBuFZ
#include <limits>
#include <iostream>

int main()
{
    unsigned int us = 42;
    int neg = -43;
    int result = us + neg;
    std::cout << result;
}
Run Code Online (Sandbox Code Playgroud)

+运算符如何"知道"返回哪个正确的类型?一般的规则是把所有的参数转换为最广泛的类型,但在这里没有明确的"赢家"之间intunsigned int.在第一种情况下,unsigned int必须选择作为结果operator+,因为我得到了结果2147483648.在第二种情况下,它必须选择int,因为我得到了结果-1.然而,在一般情况下,我没有看到这是如何可判定的.这是我看到的未定义的行为还是其他什么?

c++ arithmetic-expressions overflow integer-promotion

25
推荐指数
2
解决办法
8374
查看次数

我们应该在任何地方使用constexpr吗?

我们显然无法做到一切constexpr.如果我们什么都不做constexpr,那就不会有任何大问题.到目前为止,很多代码都没有编写.

但是打constexpr一些可能有它的东西是个好主意吗?这有什么潜在的问题吗?

c++ constexpr c++11

25
推荐指数
3
解决办法
1678
查看次数