我正在使用 Qt Creator 开发一个项目。
假设我有一个简单的工具类:
#ifndef TOOL_H
#define TOOL_H
#include <map>
#include <string>
#include "myobject.h"
class Tool
{
public:
Tool();
private:
const std::map<std::string, MyObject*> myMap;
};
#endif // TOOL_H
Run Code Online (Sandbox Code Playgroud)
使用这样的默认构造函数:
#include "tool.h"
using namespace std;
Tool::Tool()
{
myMap = new map<string, MyObject*>();
// populate myMap
}
Run Code Online (Sandbox Code Playgroud)
然后我想在另一个类的构造函数中使用该类:
#include "myclass.h"
using namespace std;
MyClass::MyClass()
{
Tool t;
}
Run Code Online (Sandbox Code Playgroud)
但我收到以下编译错误:
In function 'MyClass::MyClass()':
undefined reference to 'Tool::Tool()'
Run Code Online (Sandbox Code Playgroud)
自然,myclass.h包含tool.h,所以我不明白为什么它找不到它。我尝试使用指针,将 t 声明为成员变量,但我不断收到此错误。
我尝试使用这些类在我的外部创建一个最小的项目,并使用 g++ 对其进行编译(工具,然后是带有主函数的 MyClass);有效。那么也许 Qt Creator 如何处理编译和链接有问题?但我不知道该检查哪个选项。
谢谢你的任何想法。
编辑:问题来自 Qt Creator 环境。我实际上在 …
假设我有一个默认构造的,因此为空ov的 type对象std::optional<std::vector<int>>。
是的,std::vector可以在没有帮助的情况下表达空虚的概念std::optional,但请耐心等待。
然后让我们说,基于某种逻辑,我决定我必须用一个向量填充它,我想在这个向量上push_back一个一个元素。我该怎么办?
在我看来,以下内容有点难看:
ov = decltype(ov)::value_type{};
ov.push_back(/* something */);
ov.push_back(/* something else */);
Run Code Online (Sandbox Code Playgroud)
这真的是解决问题的方法吗?
当程序员无法向类编写任何构造函数时,编译器会提供默认构造函数。据说这些构造函数用于初始化类属性的默认值。但是,如果程序员提供了一个构造函数,则可以是简单的构造函数,例如:
public class Main {
int a;
Main() { // user defined simple constructor
System.out.println("hello");
}
public static main(String[] args) {
Main obj = new Main();
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,用户包含了一个构造函数。但是它不会初始化实例变量(a)。此外,默认构造函数不会被调用。那么为什么变量“a”被初始化为其默认值呢?
如果默认构造函数不会将类变量初始化为其默认值,而编译器会自动执行此操作,那么默认构造函数的实际用途是什么?
为什么在用户无法编写构造函数的情况下,编译器会添加默认构造函数?
这个类包含一个联合:
struct foo
{
union
{
std::vector<int> vec;
int i;
};
};
Run Code Online (Sandbox Code Playgroud)
无法实例化。如果我尝试,编译器会抛出一个错误,指出'foo::foo(void)': attempting to reference a deleted function. 为了让它工作,我必须向联合添加一个空的构造函数和析构函数,如下所示:
struct foo
{
union U
{
U() {}
~U() {}
std::vector<int> vec;
int i;
} u_;
};
Run Code Online (Sandbox Code Playgroud)
然后就可以成功实例化了。情况总是如此吗?为什么?为每个包含具有用户定义的默认构造函数的成员的联合编写一个空的构造函数和析构函数似乎很愚蠢。
我有一个非常大的结构,它具有自定义的复制构造函数、自定义的移动构造函数、自定义的移动分配器和自定义的复制分配器,但我还需要在某处使用指定初始化语法来初始化它,因为它非常大,而我只想仅初始化其中的几个字段,其余字段保留默认值。
\n例如:
\nstruct SA_t {\n int a;\n int b;\n int c;\n};\n\nint main() {\n SA_t sa1 { .a = 2, .b = 3, .c = 4,}; // no problem\n return EXIT_SUCCESS;\n};\nRun Code Online (Sandbox Code Playgroud)\n但是当我为其添加自定义构造函数时,我根本无法使用指定初始化方法。
\nstruct SA_t {\n SA_t() {\n a = 0;\n b = 1;\n c = 2;\n };\n\n int a;\n int b;\n int c;\n};\n\nint main() {\n SA_t sa1 { .a = 2, .b = 3, .c = 4,}; /* no matching function for call to …Run Code Online (Sandbox Code Playgroud) c++ constructor initialization default-constructor designated-initializer
根据我读过的内容,构造函数可以有两个含义:
在计算机编程语言中,术语默认构造函数可以指在没有任何程序员定义的构造函数的情况下由编译器自动生成的构造函数(例如,在Java中)
和
在其他语言中(例如在C++中),无论构造函数是自动生成还是使用定义,都可以调用构造函数而无需提供任何参数.
所以在C#的上下文中,默认构造函数意味着什么,它是指自动生成的构造函数,它唯一的工作是将成员初始化为某些默认值?
原因:
如果一个类没有提供任何,constructors那么default constructor(constructor without parameter)在编译时由编译器给出,但如果一个类包含,parameterized constructors那么编译器不提供默认构造函数.
我正在编译下面的代码.它给出了编译错误.
代码:
class ConstructorTest
{
// attributes
private int l,b;
// behaviour
public void display()
{
System.out.println("length="+l);
System.out.println("breadth="+b);
}
public int area()
{
return l*b;
}
// initialization
public ConstructorTest(int x,int y) // Parameterized Constructor
{
l=x;
b=y;
}
//main method
public static void main(String arr[])
{
ConstructorTest r = new ConstructorTest(5,10);
ConstructorTest s = new ConstructorTest();
s.display();
r.display();
r.area();
}
}
Run Code Online (Sandbox Code Playgroud)
控制台错误:

当我只调用时parameterized constructor.它的工作正常.但是当想要调用default …
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication8
{
class Test
{
public StringBuilder a;
/*public Test()
{
a = new StringBuilder();
} */
}
class Program
{
static void Main(string[] args)
{
Test testobj = new Test();
testobj.a.Append("Hello");
Console.WriteLine(testobj.a);
Console.ReadLine();
}
}
}
Run Code Online (Sandbox Code Playgroud)
Test Class的默认构造函数不应该为类中的每个文件调用每个默认构造函数吗?
我是Java的新手,想知道“当类包含用户定义的参数化构造函数时,为什么编译器未提供默认构造函数?”
我不明白为什么他们没有一个复制构造函数,该复制构造函数可以使原始整数倍。
众所周知,默认拷贝构造函数的主要问题是执行浅拷贝。这样,如果有一个指针,它只会复制它的地址,但是为什么不取消引用该指针而复制内容呢?当动态分配内存时会出现主要问题。因此,在有指向它的指针的情况下可以错误地删除它,这就是为什么我们要创建自己的副本构造函数而不使用默认的构造函数的原因。
但是我不明白,为什么CPP不这样做?为什么不复制内容
constructor ×6
c++ ×5
java ×3
c# ×2
oop ×2
.net ×1
c++17 ×1
optional ×1
qt-creator ×1
unions ×1