在c++中创建了类,但在创建新对象时,编译显示:不存在默认构造函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在c++中创建了类,但在创建新对象时,编译显示:不存在默认构造函数相关的知识,希望对你有一定的参考价值。

代码如下:
问题出现在主函数第二行 Stock mystock;
头文件:
class Stock

private: char* Symbol;
double price;
public:
Stock(char[] );
~Stock(void);
void set_value(double);
double get_value();
;

cpp文件:
Stock::Stock(char c[])

Symbol = c;

Stock::~Stock(void)

cout << "Stock" << Symbol << "is dying!" << endl;

void Stock::set_value(double x)
price = x;

double Stock::get_value()
return price;


主函数:
int _tmain(int argc, _TCHAR* argv[])

Stock mystock;
mystock.set_value(3);
cout << mystock.get_value() << endl;
return 0;


谢谢编程大神们

在c++中,如果你没有自定义构造函数,那么系统会给你的类提供一个默认的无参数的构造函数,你现在已经自定义了一个有参数的构造函数:Stock(char[] );
有两种解决办法:
一:你再显式定义一个无参数的构造函数,比如
Stock::Stock()

Symbol = "默认股票名";

price = 0.0;



二、你按照正确的格式使用你自定义的构造函数,即 Stock(char[]) (要带一个字符串参数):

把主函数中的 Stock mystock;
改为 Stock mystock("我的股票");
参考技术A 如果你没有自定义构造函数在C + +中系统会给你的类提供了一个默认的无参数的构造函数,你现在已经是一个有参数的构造函数的定义:股票(的char []);
有两种解决方案:
:明确地定义一个无参数的构造函数,如
库存::股票()

符号,默认股票名称“

价格= 0.0;



其次,你按照正确的格式,使用您的自定义构造函数,股票(CHAR [])(把一个字符串参数):

联合mystock主要功能;
改变到股票mystock(股票);
参考技术B 如果你没有自定义构造函数在C + +中系统会给你的类提供了一个默认的无参数的构造函数,你现在已经是一个有参数的构造函数的定义:股票(的char []);
有两种解决方案:
:明确地定义一个无参数的构造函数,如
库存::股票()

符号,默认股票名称“

价格= 0.0;



其次,你按照正确的格式,使用您的自定义构造函数,股票(CHAR [])(把一个字符串参数):

联合mystock主要功能;
改变到股票mystock(股票);
参考技术C 很明显你的构造函数有个参数,可是你构造对象时没有参数,他去找那个没有参数的构造函数,发现找不到 参考技术D 创建对象时,用的是无参的构造函数,但是程序中没有,需要定义一个无参的构造函数,或者是使用有参的构造函数创建对象。

是否在列表文字中立即创建了类的实例?

我用__init__()构造函数创建了两个简单的类,然后在列表中创建它们的实例。

我很想知道简单地在列表中创建对象是否会实际创建该类的实例,或者只是当我们稍后引用该对象(通过提及索引值)创建类实例时?

#First Class
class myClassOne(object):
  def __init__(self, a):
    self.a = a
  def __str__(self):
    return self.a

#Second class
class myClassTwo(object):
  def __init__(self, a):
    self.a = a
  def __str__(self):
    return self.a

#Instance of classes being called as an object inside the list
a = [1,2,3,myClassOne("hello"),myClassTwo("world"),"blah","blah"]
print(id(a[3]),id(a[4]))
print(a[3],a[4])

输出:

Python 3.6.1 (default, Dec 2015, 13:05:11)
[GCC 4.8.2] on linux
140362290864536 140362290864592
hello world
答案

您可以通过添加一些print语句来轻松测试:

class myClassOne:

    def __init__(self, a):
        self.a = a
        print("myClassOne instance created.")

    def __str__(self):
        return self.a


class myClassTwo:

    def __init__(self, a):
        self.a = a
        print("myClassTwo instance created.")

    def __str__(self):
        return self.a


print("Creating list 'a' ...")
a = [1, 2, 3, myClassOne("hello"), myClassTwo("world"), "blah", "blah"]
print("... list 'a' created.")

print("Printing ids ...")
print(id(a[3]), id(a[4]))
print("... ids printed.")

print("Printing items ...")
print(a[3], a[4])
print("... items printed.")

这是结果:

$ python3 hello.py 
Creating list 'a' ...
myClassOne instance created.
myClassTwo instance created.
... list 'a' created.
Printing ids ...
139953120034712 139953120034656
... ids printed.
Printing items ...
hello world
... items printed.

如您所见,实例是在创建列表a期间创建的。

情况总是如此:当你告诉Python做某事时,它会立即执行,无论该指令是否构成列表或类似对象的一部分。

请注意,告诉Python执行某些操作(如您正在创建该列表的情况),并告诉它如何执行某些操作(如您正在定义myclassOne.__init__()的情况)。

当您使用def ...块定义函数或方法时,您告诉Python如何执行某些操作,并且在您调用该函数或方法之前它实际上不会完成。

当你构建一个列表时,你告诉Python要做一些事情,所以它只是继续并且做到了。

以上是关于在c++中创建了类,但在创建新对象时,编译显示:不存在默认构造函数的主要内容,如果未能解决你的问题,请参考以下文章

DirectX9 CreateDevice 在 C 中失败,但在 C++ 中成功

如何检查是不是在 Visual C++ 应用程序中的第三方 DLL 中创建了新线程

EF Core 5 在迁移中创建了两次表

如果通过 API 创建,Backand 用户对象不与自定义用户对象关联

PYQT资源,冻结程序

在注册时,在数据库中创建了用户,但在浏览器中检查时 JWT 令牌是“未定义的”