C++ 构造函数c+内的setters函数+;

C++ 构造函数c+内的setters函数+;,c++,constructor,C++,Constructor,我试图在构造函数中使用setter函数,这是我以前从未做过的。它给了我以下错误: [Error]对“(笔记本电脑)(常量字符[5],常量字符[3],int,int)”的调用不匹配 我也需要编写setter函数吗?我是说在建造师之外?我的意思是像这样 void Laptop::setBrand(char a[]) { brand=a;} 我认为错误在第二个构造函数中,它包含四个参数,但我找不到它 代码如下: #include <iostream> #inc

我试图在构造函数中使用setter函数,这是我以前从未做过的。它给了我以下错误:

[Error]对“(笔记本电脑)(常量字符[5],常量字符[3],int,int)”的调用不匹配
我也需要编写setter函数吗?我是说在建造师之外?我的意思是像这样

void Laptop::setBrand(char a[])
   {   
        brand=a;}
我认为错误在第二个构造函数中,它包含四个参数,但我找不到它

代码如下:

#include <iostream>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
using namespace std;
class Laptop{
private:
        char brand[10];
        char processor[10];
        int ram;
        int hardDrive;
public:
        void setBrand(char Bra[]);
        void setProcessor(char Pro[]);
        void setRam(int Ram);
        void setHardDrive(int HDrive);


        char *getBrand();
        char *getProcessor();
        int  getRam();
        int getHardDrive();





        Laptop();
        Laptop(char [],char [],int ,int );                    
};

Laptop::Laptop(){

    cout<<"Default constructor called...\n";
    strcpy(brand,"None");
    strcpy(processor,"None);
    ram=0;
    hardDrive=0;
}
#包括
#包括
#包括
#包括
使用名称空间std;
班级笔记本电脑{
私人:
char品牌[10];
字符处理器[10];
内存;
int硬盘;
公众:
void-setBrand(char-Bra[]);
void setProcessor(char Pro[]);
无效设置Ram(内部Ram);
无效设置硬盘驱动器(内部硬盘驱动器);
char*getBrand();
char*getProcessor();
int getRam();
int getHardDrive();
笔记本电脑();
笔记本电脑(字符[],字符[],整数,整数);
};
笔记本电脑::笔记本电脑(){

cout您正在传递两个
const char*
作为参数,因此您应该更改此参数:

Laptop::Laptop(char-Bra[],char-Pro[],int-Ram,int-HDrive)

为此:


Laptop::Laptop(const char*、const char*、int-Ram、int-HDrive)
这里有很多错误

Laptop laptopObj1,laptopObj2;
...
laptopObj2("Dell","i5", 4, 500);
您不能使用构造函数两次。您在第一行中为这两个对象使用了构造函数
Laptop()
,然后尝试为
laptobj2
使用第二个构造函数。 您可以将第二行更改为:

laptopObj2 = Laptop("Dell","i5", 4, 500);
或者更好的定义是:

Laptop laptopObj1;
....
Laptop laptopObj2("Dell","i5", 4, 500);
另一个问题是
Laptop()
构造函数定义中的问题:

Laptop::Laptop(char Bra[],char Pro[],int Ram,int HDrive)
{
    .....
    setBrand(Bra []); // Remove the []
    setProcessor(Pro []); // Remove the []
    ....
}
还有一个问题:类的某些函数没有定义:

void setBrand(char Bra[]);
void setProcessor(char Pro[]);
void setRam(int Ram);
void setHardDrive(int HDrive);
void display();
编辑:

<> > C++的一个对象是<>代码> STD::String (<代码>包含< /COD> >)。可以使用它代替char STR[] /Cuth>——只是在C++中声明字符串的简单方法。例如,在你的例子中:

/* Replace this: */
char brand[10];
char processor[10];

void setBrand(char Bra[]);
void setProcessor(char Pro[]);

char *getBrand();
char *getProcessor();

/* With this: */
string brand;
string processor;

void setBrand(const string &Bra);
void setProcessor(const string &Pro);

string getBrand();
string getProcessor();

您确实应该使用std::string而不是char[]

在构造函数的问题上,不需要调用SETTER,如下代码所示。C++有一种能力的捷径。我使用了STD::String和固定所有TypOS。

#include <iostream>
#include <string>
using namespace std;

class Laptop
{
private:
    string brand;
    string processor;
    int ram;
    int hardDrive;

public:
    void setBrand(string Bra);
    void setProcessor(string Pro);
    void setRam(int Ram);
    void setHardDrive(int HDrive);

    string getBrand();
    string getProcessor();
    int getRam();
    int getHardDrive();

    Laptop();
    Laptop(string, string, int, int);
};

Laptop::Laptop()
    : brand("None")
    , processor("None")
    , ram(0)
    , hardDrive(0)
{
    cout << "Default constructor called...\n";
}

Laptop::Laptop(string Bra, string Pro, int Ram, int HDrive)
    : brand(Bra)
    , processor(Pro)
    , ram(Ram)
    , hardDrive(HDrive)
{
    cout << "Parameterized constructor called...\n";
}

string Laptop::getBrand()
{
    return brand;
}

string Laptop::getProcessor()
{
    return processor;
}

int Laptop::getRam()
{
    return ram;
}

int Laptop::getHardDrive()
{
    return hardDrive;
}

int main()
{
    Laptop laptopObj1;
    Laptop laptopObj2("Dell", "i5", 4, 500);

    cout << "Brand :" << laptopObj1.getBrand() << "\n";

    cout << "Processor :" << laptopObj1.getProcessor() << "\n";

    cout << "Ram :" << laptopObj1.getRam() << "\n";

    cout << "HardDrive :" << laptopObj1.getHardDrive() << "\n";

    cout << "Brand :" << laptopObj2.getBrand() << "\n";

    cout << "Processor :" << laptopObj2.getProcessor() << "\n";

    cout << "Ram :" << laptopObj2.getRam() << "\n";

    cout << "HardDrive :" << laptopObj2.getHardDrive() << "\n";
}
#包括
#包括
使用名称空间std;
班级笔记本电脑
{
私人:
串品牌;
字符串处理器;
内存;
int硬盘;
公众:
void-setBrand(弦乐文胸);
void setProcessor(stringpro);
无效设置Ram(内部Ram);
无效设置硬盘驱动器(内部硬盘驱动器);
字符串getBrand();
字符串getProcessor();
int getRam();
int getHardDrive();
笔记本电脑();
笔记本电脑(字符串,字符串,int,int);
};
笔记本电脑::笔记本电脑()
:品牌(“无”)
,处理器(“无”)
,ram(0)
,硬盘(0)
{

不可能用std:string替换所有字符数组,只想指出在默认构造函数Laptop::Laptop()中您正在声明新变量,然后它们不在您使用的范围内。您试图将
const
字符传递给需要可变字符的构造函数。虽然您的错误消息与建议的重复消息不同,但问题和解决方案是相同的。我认为您应该使用类似@skeller s的std::string但是在使用像这样的容器之前,您还应该更好地理解指针和C字符串是如何工作的。附录:
char brand[10]=“:None\n”
笔记本电脑中
构造函数没有做任何有用的事情。
char brand[10]
声明一个新的
品牌
变量,该变量不同于私有数据成员
字符品牌[10];
。构造函数中的此
品牌
仅存在于构造函数中。它被设置为包含
“:无\n”
。成员
品牌
未初始化。@user4581301你说得对。我在创建这篇文章时忘记了这件事。@KorelK先生,我也必须写setter函数的定义吗?我想如果我在构造函数中使用setter函数,比如void Laptop::setBrand(char a[]),我就不需要它们了{brand=a;}@gintoki若要在构造函数内部(或外部)使用setter函数,您必须告诉编译器该函数的作用。如果您没有为被调用函数编写定义,编译器会抛出该函数的定义缺失错误。“无需调用setter”-这取决于setter的定义。如果您有一些条件,您可能希望通过setter传递输入。。。
#include <iostream>
#include <string>
using namespace std;

class Laptop
{
private:
    string brand;
    string processor;
    int ram;
    int hardDrive;

public:
    void setBrand(string Bra);
    void setProcessor(string Pro);
    void setRam(int Ram);
    void setHardDrive(int HDrive);

    string getBrand();
    string getProcessor();
    int getRam();
    int getHardDrive();

    Laptop();
    Laptop(string, string, int, int);
};

Laptop::Laptop()
    : brand("None")
    , processor("None")
    , ram(0)
    , hardDrive(0)
{
    cout << "Default constructor called...\n";
}

Laptop::Laptop(string Bra, string Pro, int Ram, int HDrive)
    : brand(Bra)
    , processor(Pro)
    , ram(Ram)
    , hardDrive(HDrive)
{
    cout << "Parameterized constructor called...\n";
}

string Laptop::getBrand()
{
    return brand;
}

string Laptop::getProcessor()
{
    return processor;
}

int Laptop::getRam()
{
    return ram;
}

int Laptop::getHardDrive()
{
    return hardDrive;
}

int main()
{
    Laptop laptopObj1;
    Laptop laptopObj2("Dell", "i5", 4, 500);

    cout << "Brand :" << laptopObj1.getBrand() << "\n";

    cout << "Processor :" << laptopObj1.getProcessor() << "\n";

    cout << "Ram :" << laptopObj1.getRam() << "\n";

    cout << "HardDrive :" << laptopObj1.getHardDrive() << "\n";

    cout << "Brand :" << laptopObj2.getBrand() << "\n";

    cout << "Processor :" << laptopObj2.getProcessor() << "\n";

    cout << "Ram :" << laptopObj2.getRam() << "\n";

    cout << "HardDrive :" << laptopObj2.getHardDrive() << "\n";
}