C++:将一个成员指针初始化为空?
我有一个看起来像: 的课程 class Foo { public: Foo(); virtual ~Foo(); private: Odp* bar; }; 我希望将bar初始化为NULL.这是最好的方法吗? Foo::Foo() : bar(NULL) { } 另外,是否有必要虚拟灾难? (如果那是真的,那么构造函数也必须虚拟吗?) 解决方案 我希望将bar初始化为NULL.这是最好的方法吗? 这是正确的方式.所以,是的. 另外,是否有必要虚拟驱动器? 否.如果您将从Foo类继承并且将使用Foo指针删除这些派生的类(尽管作为一般的经验法则,那么如果有其他任何其他情况,则只有在Foo类中删除Foo>虚拟成员). (如果那是真的,那么构造函数也必须虚拟吗?) 否.构造函数都不需要为virtual,也不需要 can 他们. 其他解决方案 是的,初始化列表是最好的. 也许.如果您打算在班级中
6 2023-05-09
编程技术问答社区
C++类初始化列表示例
我正在新的Stroustrup书中第17章,我通过初始化初始化列表的班级来混淆. 示例: in .hpp: class A { public: A() : _plantName(std::string s), _growTimeMinutes(int 1); virtual ~A(); private: std::string _plantName; int _growTimeMinutes; }; in .cpp: A::A() : _plantName(std::string s), _growTimeMinutes(int i) { } 还是在.cpp中: A::A(std::string s, int i) : _plantName(std::string s), _growTimeMinutes(int i) { } 并称之为: A a {"Ca
0 2023-05-03
编程技术问答社区
如何从基类初始化列表中向派生初始化列表添加变量?
我有一个带有参数化构造函数的基类Showticket: //constructor ShowTicket(const char* Row, const char* SeatNumber): sold_status{false}, row(Row), seat_number(SeatNumber) {} 我正在创建一个派生的班级,即SportTicket,它将采用与ShowTicket相同的参数,但会增加新的布尔值,以跟踪Beer_sold.问题是我不知道如何告诉C ++我仍然希望Sold_status在SportTicket构造函数中进行false. 我尝试这样做: //Constructor SportTicket(const char* Row, const char* SeatNumber): ShowTicket(Row, SeatNumber),
10 2023-04-14
编程技术问答社区
使用反射在构造函数中初始化(列表)属性
我试图通过使用反射来初始化类(列表)中的所有属性: public class EntitiesContainer { public IEnumerable Addresses { get; set; } public IEnumerable People { get; set; } public IEnumerable Contracts { get; set; } public EntitiesContainer() { var propertyInfo = this.GetType().GetProperties(); foreach (var property in propertyInfo) { property.SetValue(property, Activator.CreateInstance(prop
10 2023-03-30
编程技术问答社区
将'this'对象传递给一个初始化列表
我将问题减少到以下示例代码: class Charizard { //truck trainer &myTrainer; public: Charizard(trainer &tMyTrainer); }; class trainer { Charizard myPokemon; public: trainer(); }; Charizard::Charizard(trainer &tMyTrainer) : myTrainer(tMyTrainer) {} 没有更改或添加公共成员,我如何为培训师创建构造函数,以便在初始化列表中创建mypokemon时," myTrainer"指向正在创建的培训师? 这是我尝试的: trainer::trainer() : myPokemon(this) {} 当然,"这个"不是正确的类型.我无法更改Charizard构造函数(它是公共成员),所以我不确定该怎么做.有什么想法吗?
10 2023-03-30
编程技术问答社区
构造函数初始化列表中的循环依赖性
以下定义明确吗? class A; class B; // define A, which takes B& in constructor // define B, which takes A& in constructor class C { A a; B b; public: C() : a(b), b(a) { /* stuff with a and b */ } } indeone.com . 的完整示例 只要A和B的构造函数对他们获得的参考都不做任何事情,它是否安全/定义明确? 解决方案 n4140 [class.cdtor]/1读: 对于具有非平凡构造函数的对象,指对象的任何非静态成员或基类 在构造函数开始执行之前,导致不确定的行为.对于一个非平凡的对象 驱动器,指击质器完成后的任何非静态成员或基类 执行导致不确定的行为. 虽然此段落本身并不意味着该行为是其他定义明确的,但以下示例表明它是.这是一个摘录: s
4 2023-03-30
编程技术问答社区
钻石继承图中的 "中间类 "使用非默认的虚拟基础构造函数:为什么不出现编译错误?
考虑钻石继承图(即虚拟基类).我们从上一 问题 在构造上,最派生的类直接调用(虚拟)基础的默认(0-arg)构造函数. 但我们也从上一个问题的答案中知道(例如,在这里 如果钻石中的"中间"类具有由最衍生的类和那些构造函数使用的构造函数,则"调用"其(虚拟)基类的非默认构造函数(通过初始化列表),那就是 未受到尊重……尽管执行了"中间"类的构造函数 . 为什么?我本来会认为这应该是一个编译错误. (当然,当声明最衍生的类并创建钻石时,检测到.) 我正在寻找两件事: 在标准中指定的位置? 这种明确的签名代码是否在其他任何地方发生? 代码示例我所说的内容遵循其实际和预期的输出: B 0arg-ctor Mf 0arg-ctor Mt 0arg-ctor useD 预期输出: ERROR: (line 19) struct `D` creates a diamond inheritance graph where an explicitly
如何在构造函数初始化列表中进行深度复制。
这是列表类中节点的构造函数.我需要将酿酒厂的深层复制,这是初始化列表中的其他类.项目是酿酒厂的一个实例. List::Node::Node(const Winery& winery) : item(winery) // your initialization list here { Winery w = winery; item = w; } 酿酒厂的构造函数: Winery::Winery(const char * const name, const char * const location, const int acres, const int rating) : name(name), location(location), acres(acres), rating(rating) { char *nm = new char[strlen(name) + 1];
4 2023-03-30
编程技术问答社区
用双大括号初始化向量<string>。
有人可以在下面的示例中解释用双卷和单个卷发括号初始化的行为差异吗? 代码#1: vector v = {"a", "b"}; string c(v[0] + v[1]); cout v = {{"a", "b"}}; string c(v[0] + v[1]); cout v = {"a", "b"};您通过提供两个元素的初始化列表来初始化矢量.两个std::string
6 2023-03-30
编程技术问答社区
C++构造器初始化列表的奇怪之处
我一直是一个好男孩,在写我的课程时,将所有成员变量与m _: 前缀 class Test { int m_int1; int m_int2; public: Test(int int1, int int2) : m_int1(int1), m_int2(int2) {} }; int main() { Test t(10, 20); // Just an example } 但是,最近我忘了这样做并最终写作: class Test { int int1; int int2; public: // Very questionable, but of course I meant to assign ::int1 to this->int1! Test(int int1, int int2) : int1(int1), int2(int2) {} }; 相信与否,编译的代码没有错误/警告,作业进行了正确进行!
10 2023-03-30
编程技术问答社区
C++构造器与初始化列表的速度比较
构造函数和初始化列表之间的执行时间有什么差异吗?(或者仅仅是编码偏好的问题). 我有一组需要经常创建的对象,并想知道是否有使用初始化列表而不是构造函数来获得任何性能. 如果我要创建一百万个级别的A类和B级B级的一百万个实例,那么选择会更好(这些对象代表网络中生成的数据包,因此这些数字). class A { private: int a, b; public: A(int a_var, int b_var):a(a_var), b(b_var) {}; }; class B { private: int a, b; public: B(int a_var, int b_var) { a = a_var; b = b_var; } }; 如果任何构造函数比原始类型的其他构造函数快(如示例中),如果A和B被类型替换? 会更快吗? 类型示例:
14 2023-03-30
编程技术问答社区
为什么Java不像C++那样有初始化器列表?
在C ++中,您可以在构造函数开始运行之前使用初始化列表来初始化类的字段.例如: Foo::Foo(string s, double d, int n) : name(s), weight(d), age(n) { // Empty; already handled! } 我很好奇为什么Java没有类似的功能.根据 Core Java:卷1 : c ++使用此特殊语法来调用字段构造函数.在Java中,没有必要,因为对象没有子对象,只有对其他对象的指针. 这是我的问题: 它们的意思是"因为对象没有子对象?"我不明白什么是子对象(我尝试查找它);它们是指扩展超级类的子类的实例吗? 至于为什么Java没有C ++之类的初始化列表,我认为原因是因为所有字段默认情况下都在Java中初始初始化,也是因为Java使用super keyword来调用super(或C ++ Lingo) - 类构造函数.这是正确的吗? 解决方案 在C ++中,初始化列表是
8 2023-03-30
编程技术问答社区
我如何初始化一个本身具有非三段式构造函数的对象的stl向量?
假设我有以下类: class MyInteger { private: int n_; public: MyInteger(int n) : n_(n) {}; // MORE STUFF }; 和假设此类没有默认的微不足道构造函数MyInteger().由于某种原因,我必须始终提供int来初始化它.然后假设我的代码中的某个地方我需要vector.如何在此vector中初始化每个MyInteger组件? 我有两种情况(可能的解决方案是相同的,但无论如何我都会说),一个函数内的一个普通变量: int main(){ vector foo(10); //how do I initialize each //MyInteger field of this vector? doStuff(foo); } 和类中的数据:
10 2023-03-30
编程技术问答社区
从派生类初始化列表中调用基类构造函数的顺序
struct B { int b1, b2; B(int, int); }; struct D : B { int d1, d2; // which is technically better ? D (int i, int j, int k, int l) : B(i,j), d1(k), d2(l) {} // 1st Base // or D (int i, int j, int k, int l) : d1(k), d2(l), B(i,j) {} // last Base }; 上面只是伪代码.实际上,我想知道呼叫基本构造函数的顺序很重要吗? 是否有任何案例引起的不良行为(尤其是角案件)?我的问题是在更技术方面,而不是编码样式的. 解决方案 您在问题中引用的顺序不是"调用基本构造函数的顺序".实际上,您不能称呼构造函数.用户无法调用构造函数.只有编译器可以调用构造函数. 您可以做的是指定初始化器.在这种情况下(构造函数初始器列
10 2023-03-30
编程技术问答社区
用初始化列表初始化父级成员(C++)。
是否可以使用子类的构造函数的初始化列表来初始化父母类别中声明的数据成员?我无法工作.我可以解决它,但是如果我不必这样做会很好. 一些示例代码: class Parent { protected: std::string something; }; class Child : public Parent { private: Child() : something("Hello, World!") { } }; 当我尝试此操作时,编译器告诉我:"'class'child'没有任何名称'某物'的字段.这样的事情吗?如果是这样,语法是什么? 非常感谢! 解决方案 您描述的方式是不可能的.您必须在基类中添加一个构造函数(可以受到保护)才能将其转发.类似: class Parent { protected: Parent( const std::string& something ) : something( somet
10 2023-03-30
编程技术问答社区
C++构造函数名称后面的冒号有什么作用?
结肠操作员(":")在此构造函数中做什么?它等于MyClass(m_classID = -1, m_userdata = 0);? class MyClass { public: MyClass() : m_classID(-1), m_userdata(0) { } int m_classID; void *m_userdata; }; 解决方案 这是成员初始化器列表,是构造函数实现的一部分. 构造函数的签名是: MyClass(); 这意味着可以在没有参数的情况下调用构造函数.这使其成为默认构造函数,即,当您编写MyClass someObject;>. 零件: m_classID(-1), m_userdata(0)称为成员初始化器列表.这是一种以您选择的值初始化对象的某些字段(所有这些). 执行成员初始化器列表后,执行了构造函数主体(在示例中恰好为空).在其中,您可以进行更多的作业,但是一旦输入它,所有字段
46 2023-03-30
编程技术问答社区
多变量的C++初始化列表
我正在尝试学习如何初始化列表. 我有一个简单的类,并试图初始化变量列表.第一个Month(int m): month(m)有效.我正在尝试使用多个变量来做类似的事情.这可以以这种格式吗?我必须脱离一个衬里吗? class Month { public: Month(int m) : month(m) {} //this works Month(char first, char second, char third) : first(first){} : second(second){} : third(third){} //DOES NOT WORK Month(); void outputMonthNumber(); //void function that takes no parameters void outputMonthLetters(); //void function that takes no parameters p
56 2023-03-11
编程技术问答社区
自动初始化实例变量?
我有一个看起来像这样的python课程: class Process: def __init__(self, PID, PPID, cmd, FDs, reachable, user): 接下来是: self.PID=PID self.PPID=PPID self.cmd=cmd ... 有什么方法可以自动化这些实例变量,例如C ++的初始化列表?它将省去很多冗余代码. 解决方案 您可以使用装饰器: from functools import wraps import inspect def initializer(func): """ Automatically assigns the parameters. >>> class process: ... @initializer ... def __init__(self
8 2023-03-11
编程技术问答社区
如何让一个变量依附于一个类中的其他变量?
变量international_standard_book_number有什么问题?每当isbn_field_i更改时,我如何才能改变它? #include #include class ISBN { private: unsigned int isbn_field_1 = 0; unsigned int isbn_field_2 = 0; unsigned int isbn_field_3 = 0; char digit_or_letter = 'a'; std::string international_standard_book_number = std::to_string(isbn_field_1) + "-" + std::to_string(isbn_field_2) + "-" + std::to_string(isbn_field_3) + "-" + digit_or_letter;
18 2023-03-02
编程技术问答社区