我正在c++中实现Decorator设计模式,遇到了这个问题(从获取的代码):
#include<iostream>
using namespace std;
class Base_
{
public:
// parameterized constructor
Base_(int x)
{
cout << "Base Class Constructor. Value is: " << x << endl;
}
};
class InitilizerList_:public
class A
{
private:
int a;
int b;
int c;
public:
A() : b(2), a(1), c (3)
{
}
};
根据C++标准,数据成员是按照声明的顺序构造和初始化的,对吗?
但是当使用初始化列表时,我们改变了数据成员的顺序,现在是按照初始化列表的顺序还是声明的顺序进行初始化?
如果我用默认构造函数声明一个类,并用初始化列表定义这个类的一个实例,如下所示,这个定义会调用默认构造函数吗?为什么会被调用或者没有被调用?
class Sample
{
// this should be any aggregate type in c++
};
int main()
{
Sample s = {0};
return 0;
}
我昨天才知道,为初始化器列表项指定参数是可选的。然而,在这种情况下发生的规则是什么?
在下面的示例中,ptr是否会被初始化为0,切换为false,以及Bar default-constructed?我猜这个问题有点多余,因为如果未指定的参数值为==未定义的行为,则初始化器列表中几乎没有意义。
我是否还可以参考C++标准中的一节,该节规定了初始化器列表项未被赋予参数的情况下的行为?
class Bar
{
Bar() { }
};
class SomeClass;
class AnotherClass
{
public:
SomeClass *ptr;
bool tog
编辑:尚未回答-链接的问题是关于普通的r值,初始化器列表是一个单独的概念,如果相关的话。
这条语句是定义良好的,还是在初始化器列表中使用前缀增量运算符,在列表中出现两次的变量,未定义的行为?
struct T t = { i, ++i };
我对ANSI最感兴趣,但了解其他版本的C和/或C++是否不同也很有用。如果类似如下的构造是合法的:
struct T t = { i, i++ };
struct T t = { ++i, ++i };
struct T t = { i++, ++i };
struct T t = { i++, i++ };
我对使用list初始化结构时的C++行为有疑问。例如,下面的代码在C和C++中的行为是相同的。列表初始化x
struct X {
int x;
};
int main(int argc, char *argv[])
{
struct X xx = {0};
return 0;
}
现在,如果添加构造函数,则通过测试可以发现调用构造函数而不是x成员的简单初始化:
#include <iostream>
using namespace std;
struct X {
int x;
X(int);
};
X::X(int i)
{
我认为现代的C++初始化程序列表对于初始化对象非常有用,以至于无需定义自己的构造函数:
struct point
{
float coord[3];
};
point p = {1.f, 2.f, 3.f}; // nice !
但是,当我的类从另一个类继承时,这个方法不起作用:
template<typename T>
class serializable
{
protected:
serializable() = default;
...
// other stuff
}
struct point : public seria
C++中的初始化程序列表构造函数经常会造成麻烦;例如
using std::vector;
using std::string;
vector<string> v{3}; // vector of three empty strings
vector<int> u{3}; // vector of one element with value 3
(澄清一下,我的意思是<int>构造函数是初始化程序列表构造函数,而<string>构造函数不是。)
int大小写与初始化程序列表构造函数匹配,而string大小写则不匹配,这有点难看,而且经常会带来麻
在C++中,创建一定大小的列表的推荐方法是什么,其中列表的每个元素都是一个由3个元素组成的列表?
类比
为了澄清,Python中对我所做的工作的类推如下:
最简单的:
n = 10
ls = [[0,0,0] for i in range(n)]
已经初始化好了,我可以访问元素(例如ls[0][0]),甚至修改它们(ls[0][0]=2),完美!
或者使用numpy
import numpy as np
n = 10 #number of elements
ls = np.empty((n,0)).tolist()
然后,在每个元素(这里是一个列表)中,我们会追加我们的3个值。
基本尝试
现
如何在没有错误或警告的情况下使用函数指针初始化一个联合?代码是针对嵌入式的,必须在C和C++中编译它。
但是,我面临的问题是,直接初始化会产生与C不兼容的指针的警告,以及C++中的一个错误,而指定的初始化在C++中已经被废弃。
在C和C++中,有没有任何方法可以在没有警告和错误的情况下这样做?
最起码的例子:
struct List {
union {
int (*foo)(int num, int data);
int (*fee)(int num, float data);
};
};
int foo_fun(int pnum, int
我有以下C++ 11代码:
int *ipa = new int[5]{1, 2, 3};
我认为我理解了元素3和4应该是值(在本例中是0)初始化的。在Visual C++ 2013中,这一点正在发生。在Mingw 4.8.1中则不是这样;它们是默认初始化(即未初始化)。
我的问题是,这是一个已知的编译器(GCC或MingW)错误吗?我搜索了所有的bug列表(和谷歌搜索),但都是徒劳的。或者,我是不是误解了应该发生的事情?
我有一个关于构造函数初始化程序列表的问题如下:在指定成员的初始值时,根据C++ Primer (作者- Stanley ),初始值被写在()-括号中。然而,我也看到{}被用来指定初始值(请参考链接- ),有人可以解释何时使用() -括号以及何时使用{} -花括号-谢谢和问候,-sunil puranik。
我有下一节课
//ChallengeManager.h:
#include "EntityGenerator.h"
class ChallengeManager
{
public:
...
EntityGenerator _entityGenerator; /* With this declaration, constructor of the EntityGenerator will be callen in the ChallengeManager initialization list. If we will comment this out -
在他的“使用C++编程、原则和实践”一书中,Bjarne在第314-316页中介绍了成员初始化程序列表的概念(§9.4.4)。他使用了以下示例:
// Simple Date (year, month, day)
class Date
{
public:
Date(int yy, int mm, int dd): y{yy}, m{mm}, d{dd}
{
//...
}
private:
int y, m, d;
};
在第315页,他说:
我们本可以写到:
日期:日期( int yy,int mm,int dd) //构造函数{y= y
我是c++的初学者。最近,在练习编写链接列表时,我尝试使用初始化列表为类构造函数将NULL赋值给head->next。
在类构造器中,它警告我的箭头操作符“期望a”(或“{”)。为什么会有这样的错误?(我知道我可以在块中初始化类成员,但是为什么不能用这个指针来实现呢?)谢谢!
下面是链接列表的头文件:
linkedlist.h
#include <iostream>
using namespace std;
struct node {
int val;
node *next;
};
class linkedlist {
private:
node *head;
int l
以类型安全的方式将对象的列表/向量/数组从c++/cli返回到c#最简单的方法是什么?
//C++/CLI project 1
public ref class MyClass
{
}
public ref class Factory
{
array<MyClass^> getObjects() {...}
}
//C# project 2
Factory f = new Factory();
System.Array a = f.getObjects(); // not typesafe! I'd like to get an array/list/vecto