gpt4 book ai didi

公共(public)成员的 C++ 替代方案

转载 作者:行者123 更新时间:2023-11-28 00:25:03 26 4
gpt4 key购买 nike

考虑这个例子

class Sprite    
{
public:
Sprite(int imageID, int maskID);
~Sprite();
//some methods
}

Sprite::Sprite(int imageID,int maskID)
{
//this is the class for creating sprites in winapi..its doesnt matter what it has in this example
}

Sprite::~Sprite()
{
DeleteObject ( mhImage );
DeleteObject ( mhMask );
}

class Car{
public:
enum Type{
Ferrari,
BWM
};
Car(Type type);
~Car();
void InitSpeed()
void ChangeSpeed();
//..some methods
private:
Sprite *car;
}

及其实现

Car::Car(Type type)
{
switch(type)
{
case Ferrari:
car=new Sprite("Ferrari","FerrariMask");
break;
case BMW:
car=new Sprite("BMW","BMWMask");
break;
}
}

void Car::InitSpeed()
{
speed=100;
}

void Car::ChangeSpeed()
{
speed=200;
}

Car::~Car()
{
delete car;
}

class BuildCar:public Car
{
public:
BuildCar();
~BuildCar();
Car*BMW;
Car*Ferrari;
}

BuildCar::BuildCar()
{
Ferrari=new Car(Ferrari);
BMW=new Car(BMV)
}

BuildCar::BuildCar()
{
delete Ferrari
delete BMW;
}

在 5 月的主课中,我将有:

#include "Car"

class Game
{
private:
//etc
BuildCar*mycars;

//etc;
}

Game::Game()
{
mycars=new BuildCar();
mycars->BMW->InitSpeed();
mycars=>Ferrari->InitSpeed();

....
at some point i will have:
mycars->BMW->ChangeSpeed();
mycars->Ferrari->ChangeSpeed();
}

如果我将 Car*BMWCar*Ferrari 设为 BuildCar 的私有(private)成员,整个程序将无法运行,因为我不能访问 BuildCar 类的私有(private)成员。

我可以在 BuildCars 中将它们设为私有(private)。我将添加一些 setter 和 getter 以便我可以访问它们,但是如果我有很多指向 car 的指针怎么办?例如,我将不得不在 BuildCar 中制作许多 setter 和 getter:

Car*GetBMW()
{
return BMW
}

Car*GetFerrari()
{
return Ferrari;
}

现在在我的主课上它会起作用

mycars->GetBMW()->ChangeSpeed();
mycars->GetFerrari()->ChangeSpeed();

我知道将类(class)成员公开是一种不好的做法,但在我的示例中情况如何?可以做什么?

最佳答案

这没有回答您的问题,但设计可能会更好一些。与其使用一个处理多种类型汽车的 Car 类,不如使用一个 Car 基类,并让其他汽车类型继承自该类。

然后 CarBuilder 类就是所谓的 factory class它区分不同类型的汽车,但返回一个 Car 实例给你。

有点像

#include <iostream>
#include <memory>

class Car
{
public:
Car() : speed(0) {}
virtual ~Car() {}

void setSpeed(int speed) { this->speed = speed; }
int getSpeed() const { return speed; }

virtual std::string getType() = 0;

private:
int speed;
};

struct Ferrari : public Car
{
std::string getType() { return "Ferrari"; }
};

class BMW : public Car
{
std::string getType() { return "BMW"; }
};

class CarBuilder
{
public:
enum CarType
{
Ferrari,
BMW
};

static std::unique_ptr<Car> makeCar(const CarType type)
{
switch (type)
{
case Ferrari:
return std::unique_ptr<Car>(new ::Ferrari);
case BMW:
return std::unique_ptr<Car>(new ::BMW);
default:
return nullptr;
}
}
};

int main()
{
auto myCar = CarBuilder::getCar(CarBuilder::Ferrari);
std::cout << "My car is a " << myCar->getType() << '\n';
}

上面的程序会打印

My car is a Ferrari

关于公共(public)成员的 C++ 替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25471352/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com