我已将问题简化为以下示例代码:
class Charizard { //truck
trainer &myTrainer;
public:
Charizard(trainer &tMyTrainer);
};
class trainer {
Charizard myPokemon;
public:
trainer();
};
Charizard::Charizard(trainer &tMyTrainer) : myTrainer(tMyTrainer) {}
Run Code Online (Sandbox Code Playgroud)
在不更改或添加公共成员的情况下,如何为培训师创建构造函数,以便在初始化列表中创建myPokemon时,"myTrainer"指向正在创建的培训师?
这是我尝试过的:
trainer::trainer() : myPokemon(this) {}
Run Code Online (Sandbox Code Playgroud)
但当然"这个"不是正确的类型.我无法改变Charizard构造函数所采用的内容(它是一个公共成员),所以我不知道该怎么做.有任何想法吗?
注意:标题可能需要一些工作.
我一直在将一些数学类转换为模板并使用初始化列表,并在继承的类需要在初始化时访问基类数据成员时遇到问题.
这是代码:
template <typename T>
struct xCoord2
{
T x;
T y;
xCoord2(T _x, T _y) : x(_x), y(_y) {};
};
template <typename T>
struct xCoord3 : xCoord2<T>
{
typedef xCoord2<T> B;
T z;
// All Error
xCoord3(T _x, T _y, T _z) : x(_x), y(_y), z(_z) {};
xCoord3(T _x, T _y, T _z) : B::x(_x), B::y(_y), z(_z) {};
xCoord3(T _x, T _y, T _z) : this->x(_x), this->y(_y), z(_z) {};
// Works
xCoord3(T _x, T _y, T _z) { B::x …
Run Code Online (Sandbox Code Playgroud) 显式为C++对象构造函数提供FULL初始化列表是否有任何优点或缺点?(尽管我们只是使用默认构造函数,但是你已经列出了所有成员的全部内容?)
例如,如果我有对象:
class MyObject
{
public:
MyObject();
private:
double _doub;
Foo _foo;
std::set<int> _intSet;
int _int;
Bar _bar;
}
Run Code Online (Sandbox Code Playgroud)
与我的构造函数是否有任何区别:
MyObject::MyObject():
_doub(1.4), _foo("me"), _intSet(),
_int(5), _bar() {};
Run Code Online (Sandbox Code Playgroud)
与仅列出我特别需要设置数据的对象(或调用非默认构造函数):
MyObject::MyObject():
_doub(1.4), _foo("me"), _int(5) {};
Run Code Online (Sandbox Code Playgroud)
如果Class只有它使用默认构造函数的对象,我是否应该设置初始化列表?
例如:
class MyObject
{
public:
MyObject();
private:
Foo _foo;
std::set<int> _intSet;
Bar _bar;
}
Run Code Online (Sandbox Code Playgroud)
是否有一个像这样的构造函数?
MyObject::MyObject():
_foo(), _intSet(), _bar() {};
Run Code Online (Sandbox Code Playgroud)
谢谢.
C99引入了结构指定的初始化器的概念.例如,给定:
typedef struct {
int c;
char a;
float b;
} X;
Run Code Online (Sandbox Code Playgroud)
我可以初始化为:X foo = {.a = '\1', .b = 2.0F, .c = 4};
并且调用:printf("c = %d\na = %hhu\nb = %f", foo.c, foo.a, foo.b);
将输出:
c = 4
a = 1
b = 2.000000
这里提到这有分配给的"令人惊讶的行为" c
,然后a
再b
独立我指定的初始的顺序.
如果我有这样的函数,这将成为一个真正的问题:
int i = 0;
int f() {
return ++i;
}
int g() {
i += 2;
return i;
}
int h() {
i += 4; …
Run Code Online (Sandbox Code Playgroud) 我想在类中初始化一堆成员以保持源文件更清晰.但是,对象采用我只通过构造函数接收的参数,并且可以通过赋值在构造函数初始化列表或构造函数中初始化.(第二种选择肯定不会起作用.)这基本上是这样的情景:
在标题中
class Foo
{
public:
Foo(Pointer * ptr);
private:
Pointer * ptr;
Member m1{ptr, "SomeText"};
Member m2{ptr, "SomeOtherText"};
}
Run Code Online (Sandbox Code Playgroud)
在CPP
Foo::Foo(Pointer*ptr) :
ptr(ptr)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是:标准是否说明了ptr
和m1
/ 之间的初始化顺序m2
.显然,这段代码只有在ptr
之前m1
和之前初始化时才有效m2
.
c++ initialization operator-precedence initialization-list in-class-initialization
这是我的 ThorDetectorSwitch.cpp 文件构造函数的 C++ 代码:
ThorDetectorSwitch::ThorDetectorSwitch() : _mcSwitch(__uuidof(MCLControlClass))
{
_A = WstringToBSTR(L"A");
_B = WstringToBSTR(L"B");
_C = WstringToBSTR(L"C");
_D = WstringToBSTR(L"D");
_deviceDetected = FALSE;
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,初始化列表_mcSwitch(__uuidof(MCLControlClass))
用于初始化 COM 对象(MCLControlClass,从 COM dll 注册)。
我想知道我是否可以在此初始化列表之前调用 CoInitialize() ?因为我收到“CoInitialize() 尚未被调用”的异常。或者有其他方法可以避免这种异常吗?
多谢。
我有一个与3d网格一起使用的程序.这个网格有自己的类对象Grid,看起来像这样(简化版):
class Grid
{
public:
Grid() { readDataFromInputFile(); }
private:
void readDataFromInputFile() {...} // this function reads the values for i, j, k from disk
int i; int j; int k;
};
Run Code Online (Sandbox Code Playgroud)
我现在想做的是能够将变量i,j和k设置为const int,以避免在其他函数中意外地搞乱它们.但是我不能在成员初始化列表中轻松设置它们,因为它们必须从文件中读取.我一直在浏览现有的讨论,但我找不到关于这个问题的准确讨论.
有没有一个解决方案能够将它们设置为const,并且仍然能够使用复杂的函数来检索数据?在我的实际应用程序中,当然还有更多要读取的变量,初始化后不允许更改.
考虑下面的课程
class A
{
int a;
double b;
float c;
A():a(1),c(2),b(3)
{}
}
Run Code Online (Sandbox Code Playgroud)
我们是否必须按照我们在类中声明的顺序使用初始化列表中的变量?初始化列表中的变量顺序是否会对该类/变量的内存分配产生影响?(考虑一下场景,如果类有很多bool变量,很多双变量等等.)
class Foo
{
Foo(double InitValue): StoredDouble(InitValue)
{
}
double StoredDouble;
}
Run Code Online (Sandbox Code Playgroud)
是否有一种语法可以让我在初始化列表后跳过花括号?我知道这是一件小事,但我想在我的代码中尽可能简洁.
编程非常新,所以请原谅我可能没有看到明显的东西.
基本上我只是想知道为什么所有三个代码都编译,但是在TWO和THREE情况下产生的可执行文件CRASH(我用注释标记了差异)
#include <iostream>
#include <string>
using namespace std;
string testrace = "dog"; //defining it only globally
class Attributes {
public:
Attributes (string race){
if (race == "human"){
intelligence = 10;}
else if (race == "dog"){
intelligence = 4;}
}
int intelligence;
};
class Dalmatian: public Attributes{
public:
// but NOT locally
Dalmatian (): Attributes{testrace} { //using it as an argument
cout << "do i even arrive here" << endl;
}
};
int main() {
Dalmatian bob; …
Run Code Online (Sandbox Code Playgroud)