相关疑难解决方法(0)

为什么在C++ 20中不推荐使用std :: is_pod?

std::is_pod可能会在C++ 20中弃用.
这个选择的原因是什么?我应该用什么来代替std::is_pod知道某种类型是否真的是POD?

c++ type-traits

69
推荐指数
1
解决办法
6730
查看次数

memset()或值初始化将结构清零?

在Win32 API编程中,通常使用struct具有多个字段的C s.通常只有其中几个具有有意义的值,而其他所有值都必须归零.这可以通过以下两种方式之一实现:

STRUCT theStruct;
memset( &theStruct, 0, sizeof( STRUCT ) );
Run Code Online (Sandbox Code Playgroud)

要么

STRUCT theStruct = {};
Run Code Online (Sandbox Code Playgroud)

第二个变体看起来更干净 - 它是一个单行,它没有任何可能输错的参数并导致错误被种植.

与第一个变体相比,它有任何缺点吗?使用哪种变体?为什么?

c c++ struct initialization visual-c++

63
推荐指数
6
解决办法
7万
查看次数

C++ - struct vs. class

可能的重复:
C/C++ Struct vs Class C++
中的POD类型是什么?

嗨,

C++ In a Nutshell一书中,在第6章:类中,在Access说明符下面,提到了以下内容:

在类定义中,成员和基类的默认访问权限是私有的.在结构定义中,默认值为public.这是类和结构之间的唯一区别,尽管按照惯例,一些程序员仅将结构用于POD类,并将类用于所有其他类.

我的问题是:

  • 类和结构之间是否存在另一个区别,因为结构不包含函数而只保存数据?
  • 什么是POD课程?而且,这里所有其他课程的含义是什么?那么特殊课程吗?

谢谢.

c++ struct class pod

50
推荐指数
3
解决办法
10万
查看次数

为什么不能在C++中的非POD结构上使用offsetof?

我正在研究如何在C++中将成员的内存偏移量转换为类,并在维基百科上看到了这一点:

在C++代码中,您不能使用offsetof来访问非Plain Data Data Structures的结构或类的成员.

我尝试了它似乎工作正常.

class Foo
{
private:
    int z;
    int func() {cout << "this is just filler" << endl; return 0;}

public: 
    int x;
    int y;
    Foo* f;

    bool returnTrue() { return false; }
};

int main()
{
    cout << offsetof(Foo, x)  << " " << offsetof(Foo, y) << " " << offsetof(Foo, f);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我收到了一些警告,但它已经编译,运行时它给出了合理的输出:

Laptop:test alex$ ./test
4 8 12
Run Code Online (Sandbox Code Playgroud)

我想我要么误解POD数据结构是什么,要么我错过了其他一些难题.我不知道问题是什么.

c++ offsetof

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

解析二进制文件.什么是现代方式?

我有一个二进制文件,我知道一些布局.例如,让格式如下:

  • 2个字节(无符号短) - 字符串的长度
  • 5个字节(5个字符) - 字符串 - 一些id名称
  • 4个字节(unsigned int) - 一个步幅
  • 24个字节(6个浮点数 - 每个3个浮点数的2个步长) - 浮点数据

该文件应该看起来像(为了便于阅读,我添加了空格):

5 hello 3 0.0 0.1 0.2 -0.3 -0.4 -0.5
Run Code Online (Sandbox Code Playgroud)

这里5 - 是2个字节:0x05 0x00."你好" - 5个字节,依此类推.

现在我想读这个文件.目前我这样做:

  • 将文件加载到ifstream
  • 读这个流到 char buffer[2]
  • 把它变成无符号的短语:unsigned short len{ *((unsigned short*)buffer) };.现在我有一个字符串的长度.
  • 读取流vector<char>std::string从此向量创建一个.现在我有字符串ID.
  • 以相同的方式读取接下来的4个字节并将它们转换为unsigned int.现在我有一个进步.
  • 虽然不是文件结尾读取浮动的方式相同 - 为每个浮点数创建一个char bufferFloat[4]和转换*((float*)bufferFloat).

这有效,但对我来说它看起来很难看.我可以直接读取unsigned shortfloatstring等没有char [x]创造?如果不是,那么正确投射的方法是什么(我读过我正在使用的那种风格 - 是旧风格)?

PS:当我写一个问题时,我头脑中提出的解释越清晰 - 如何从任意位置投出任意数量的字节char …

c++ binary casting

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

声明一个类的const实例

假设我有一个如下定义的类:

class foo{};
Run Code Online (Sandbox Code Playgroud)

现在,这是完全可以接受的;

foo f;
Run Code Online (Sandbox Code Playgroud)

怎么会出现编译错误?(uninitialized const ‘f’)

const foo f;
Run Code Online (Sandbox Code Playgroud)

我们为什么要这样做?

const foo f = foo();
Run Code Online (Sandbox Code Playgroud)

我知道为什么我们不能这样做..

const foo f(); // though it compiles..
Run Code Online (Sandbox Code Playgroud)

有趣的是,以下内容是有效的:

const std::string f;
Run Code Online (Sandbox Code Playgroud)

那么缺少foo什么?

我意识到那里有三个问题,这是一个糟糕的形式,但我希望有人可以在一个答案中为我解决这个问题.

编辑:如果它是愚蠢的,请随时关闭它...

c++ const

36
推荐指数
2
解决办法
5356
查看次数

如果我们只有一个成员,那么结构和联盟之间有什么区别吗?

我想知道一个成员数据类型的结构和联合之间的区别,如果有的话.

c c++ struct unions c++11

33
推荐指数
1
解决办法
2033
查看次数

在C#构造函数中初始化时哪个更好:初始化列表或赋值?

A类使用初始化列表将成员设置为参数值,而B类使用构造函数体内的赋值.

只要我保持一致,任何人都可以给出任何理由而不喜欢一个吗?

class A
{
    String _filename;

    A(String filename) : _filename(filename)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)


class B
{
    String _filename;

    B(String filename)
    {
        _filename = filename;
    }
}
Run Code Online (Sandbox Code Playgroud)

c# constructor initialization variable-assignment

28
推荐指数
3
解决办法
4万
查看次数

什么是C++中的标量对象?

据我所知,基本类型是Scalar和Arrays是聚合的,但是用户定义的类型呢?我将以什么标准将它们分为两类?

struct S { int i; int j };
class C { public: S s1_; S s2_ };
std::vector<int> V;
std::vector<int> *pV = &v;
Run Code Online (Sandbox Code Playgroud)

c++ theory types

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

如果我删除一个类,它的成员变量是否会自动删除?

我一直在研究,没有任何相关的问题,所以我来到这里.

我试图避免内存泄漏,所以我想知道:

假设我有一个MyClass成员ints ab一个类int array c,它们填充了一个成员函数:

class MyClass
{
    public:
        int a, b;
        int c[2];
        void setVariables() 
        {
            a, b = 0;
            for (int i = 0; i < 2; i++) 
            {
                c[i] = 3;
            }
        }
};
int main(int argc, char* argv[])
{
    MyClass* mc = new MyClass();
    mc->setVariables();
    delete mc;
} 
Run Code Online (Sandbox Code Playgroud)

现在,我打电话后delete mc,会a,b以及所有的内容c被删除?或者我必须在析构函数中明确地做到这一点MyClass

c++ variables class member delete-operator

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