c++ - 如何在不创建构造函数的情况下使用私有(private)/ protected 成员初始化 POD 结构?

标签 c++

POD can have private/protected members

由于 protected 成员,不可能像这样初始化结构:

struct SomePOD_t {
protected:
    char *p_begin;
    char *p_end;
};

void foo() {
    const char *STR = "Some data";
    SomePOD_t data = { STR, STR + strlen(STR)+1 }; // error "no mathing constructor for
                                                   // initialization of SomePOD_t"
}

我的问题是如何更轻松地将 POD 类型传递给函数:

// gonna use this foo
void foo_uses_some_pod(SomePOD_t data);

void foo()
{
     const char *STR = "Some data";

      //error "no matching function for call to 'foo_uses_some_pod'"
      // "candidate function not viable: cannot convert initializer list argument to 'SomePOD_t'"
     foo_uses_some_pod({STR, STR + strlen(STR)+1});

     //ok, if SomePOD_t::static_built_function is defined.
     foo_uses_some_pod(SomePOD_t::static_built_function(STR, STR + strlen(STR)+1)); 
}

我认为显式类型映射 SomePOD_t{STR, STR + strlen(STR)+1}在函数调用中是一个很好的做法,但是多余static_built_functionSomePOD_t::static_built_function(STR, STR + strlen(STR)+1)太多了。

如果我将构造函数添加到 SomePOD_t它将不再是 POD,因此所有使用 SomePOD_t 的类型也将成为非 POD,我必须使用 SomePOD_t 为每种类型添加构造函数作为成员,或者使用具有类型 ... ... 的类型,该类型具有 SomePOD_t作为成员(member)。

类型可以是 POD、具有私有(private)/ protected 成员并支持初始值设定项列表初始化吗?怎么办?

最佳答案

随着时间的推移,情况发生了变化。最近的 C++ 语言规范已弃用“POD”类的概念。现在有一个“聚合”的概念。聚合不能有 protected 或私有(private)成员,也不能有非默认构造函数。 initialization您正在尝试使用可以应用于聚合的初始值设定项列表。

由于您有 protected 成员,因此聚合初始化不适用。如果您想使用初始值设定项列表构造对象,您需要提供一个构造函数来执行此操作。

关于c++ - 如何在不创建构造函数的情况下使用私有(private)/ protected 成员初始化 POD 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59057679/

相关文章:

c++ - Mac C++/eclipse 无法调试 : Error while launching command: gdb --version

c++ - 我可以在 using 声明中正确使用 C++20 概念吗?

python - Cython 中的这个声明是什么? cdef PyObject ** worker 。它是指向指针的指针吗?

c++ - 使用 cout 建表

c++ - 动态分配一个二维数组

c++ - 在 C++ 中获取指向数组的指针的拷贝

c++ - 如何调用 Qt Quick 2 Extension Plugin 的方法?

c++ - 在 catch block 中使用 g++ 或 clang++ 启用未引用局部变量警告

c++ - 如何更改宏函数参数扩展顺序?

java - 如何在执行jar文件时打开cmd(qt QProcess)