相关疑难解决方法(0)

709
推荐指数
11
解决办法
17万
查看次数

有没有办法在条件语句中声明对象?

流程图

我无法根据用户的选择搞清楚如何正确创建对象.

在程序中,我问用户他们想要成为他们的班级 - 骑士或巫师.我输入'1'或'2'代表骑士和巫师.

我做了一个switch语句,在case 1中,我声明了一个对象Knight,对于Wizard也是如此.

我需要在switch语句之外使用这些对象,但我不能.我试图制作一个'默认'对象,制作'玩家播放器'; 但由于Player类具有纯虚函数,我也不能这样做.

我该如何有效地做到这一点?

这是我到目前为止:

int main()
{
std::string plyrName;
int input;
bool foo = false;

std::cout << "What is your name?\n";
std::cin >> plyrName;
std::cin.ignore(1000, '\n');

std::cout << "\nWelcome, " << plyrName << ". What class would you like to be?\n";
std::cout << "1. Knight.\n2. Wizard.\n";
std::cin >> input;

while (input != 1 && input != 2)
{
    if (foo == true)
        std::cout << "Please enter 1 for Knight and 2 for Wizard.\n";
    if …
Run Code Online (Sandbox Code Playgroud)

c++ if-statement object

6
推荐指数
1
解决办法
241
查看次数

对象切片如何导致内存损坏?

C++ 专家兼 D 语言创始人Walter Bright表示:

切片问题很严重,因为它可能导致内存损坏,并且很难保证程序不会受到这种情况的影响。为了从语言中设计它,支持继承的类应该只能通过引用(而不是通过值)访问。D 编程语言具有这个特性。

如果有人通过给出一个 C++ 示例来解释它会更好,其中对象切片问题导致内存损坏?而这个问题用D语言是如何解决的呢?

c++ inheritance d memory-corruption object-slicing

5
推荐指数
1
解决办法
1135
查看次数

这是什么?按值捕获多态类型 X [-Wcatch-value=]

有谁知道以下编译warning: catching polymorphic type ‘class std::out_of_range’ by value [-Wcatch-value=]警告的含义以及如何纠正它?我从 Stroustrup 的 C++ 4th Edition 字面上复制了这个代码块。谢谢

#include <iostream>
#include <vector>
#include <list>
using std::vector;
using std::list;
using std::cout;

template <typename T>
class Vec : public vector<T> {
 public:
  using vector<T>::vector;  // constructor

  T& operator[](int i) { return vector<T>::at(i); }
  const T& operator[](int i) const { return vector<T>::at(i); }
};

int main(int argc, char* argv[]) {
  vector<int> v0 = {0, 1, 2};
  Vec<int> v1 = {0, 1, 2};

  cout << …
Run Code Online (Sandbox Code Playgroud)

c++

5
推荐指数
2
解决办法
4422
查看次数

如何正确使用虚函数

我正在课程中学习c ++,而我们只是在学习虚拟函数

我们有一个任务来创建一个基类:汽车

和3个派生类:

  • 思域
  • 奥德赛
  • 法拉利

基类有一个name成员变量(带有getter和setter)和一个getDoorSpecs函数,返回默认值

每个子类也都有getDoorSpecs,我们应该将其创建为虚拟函数。

我们提供了一个主要函数作为驱动程序,不允许我们对其进行修改,并且我们必须创建一个单个函数attachDoors(),该函数可以接收每个子类的实例-并使用正确的getDoorSpecs返回值。

我以为我终于正确创建了虚函数-但是当我运行它时,我显然还不明白如何创建attachDoors函数来利用子类的虚函数。我以为,如果我先调用基类,然后再调用该函数,则子类方法将覆盖它,但是虽然可以很好地编译,但是它给我的输出并不正确。

这是我的代码:

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

class Car
{
public:
   string name;

   Car() {
      name = "Unknown model";}

   string getName(){
      return name;}

   void setName(string iName){
      name = iName;}

   virtual string getDoorSpecs(){
      return "Unknown doors";}
};

class Civic   :   public Car
{
public:
   Civic(){
      name = "Civic";}

   virtual string getDoorSpecs() override{
      return "4 doors";}
};

class Odyssey   :   public Car
{
public:
   Odyssey(){
      name = "Odyssey";}

   virtual string …
Run Code Online (Sandbox Code Playgroud)

c++

3
推荐指数
1
解决办法
59
查看次数

如何在C++中声明抽象类的向量列表?

我有几个类继承自一个主类。为了简单起见,我过度简化了类定义,使其简短明了。

动物.h

所有其他类都继承自的主类:

class Animal {
protected:
    string name;
public:
    Animal(string name);
    virtual string toString() { return "I am an animal"; }
};
Run Code Online (Sandbox Code Playgroud)

鸟.h

class Bird: public Animal {
private:
    bool canFly;
public:
    Bird(string name, bool canFly = true) 
     : Animal(name)   // call the super class constructor with its parameter
    {
        this->canFly = canFly;
    }
    string toString() { return "I am a bird"; }
};
Run Code Online (Sandbox Code Playgroud)

间接.h

class Insect: public Animal {
private:
    int numberOfLegs;
public:
    Insect(string name, int numberOfLegs) : …
Run Code Online (Sandbox Code Playgroud)

c++ polymorphism inheritance vector

3
推荐指数
1
解决办法
2341
查看次数

为什么一个物体在被推入容器时会失去其多态性?

child从中派生的对象base

class base
{
    public:
    virtual int get() const { return 0;}
    ~virtual base(){}
    };

    class child : public base
    {
    public:
    virtual int get() const override { return 1; }
};
Run Code Online (Sandbox Code Playgroud)

当加入容器时切成薄片,例如

std::vector<base> bases;
bases.push_back(child());
Run Code Online (Sandbox Code Playgroud)

并且下面的代码返回0

bases.at(0).get();
Run Code Online (Sandbox Code Playgroud)

即使push_back的签名是:

void push_back( const T& value );
void push_back( T && value );
Run Code Online (Sandbox Code Playgroud)

这不应该招致切片的对象.

例如,下面的代码导致bad_cast

dynamic_cast<child &>(bases.at(0))
Run Code Online (Sandbox Code Playgroud)

而与基地的孩子打电话则表现出多态行为

void toto(base const & e)
{
    std::cout << e.get() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

这意味着对象不再是一个孩子; 切片在哪里?实际发生了什么?

是否有可能设置basechild应对放置在容器中并且对象不会失去其多态性?

这是一个基本原理问题,并且已经知道一个对象被复制了,所以请不要建议指针/ shared_ptr,因为这已在其他地方得到解决.

c++ polymorphism

1
推荐指数
1
解决办法
105
查看次数

虚拟表和对象切片

在对象切片中,当派生类对象复制到基类对象时,派生类的_vptr是否也会像基类的其他成员一样复制到基类的_vptr?如果没有,为什么?

class Base {
public :
    virtual void Display() { cout << "In Base" << endl; }
};
class Derived:public Base {
public:
    void Display() { cout << "In Derived" << endl; }
};
int main()
{
    Derived objD;
    Base objB;
    objB = objD;
    objB.Display();
}
Run Code Online (Sandbox Code Playgroud)

我观察到上述代码片段的以下结果。

Output
In Base
Run Code Online (Sandbox Code Playgroud)

c++ vtable vptr object-slicing

1
推荐指数
1
解决办法
757
查看次数

多态性是否适用于值?或者通过(base-)value返回时使用派生类的move构造函数

我建立某种工厂方法返回一个DerivedClassBaseClass下列方式:

BaseClass Factory() 
{
    return DerivedClass();
}
Run Code Online (Sandbox Code Playgroud)

是的,BaseClass当我调用该方法时,将使用的move构造函数:

BaseClass object = Factory();
Run Code Online (Sandbox Code Playgroud)

由于我无法制作的move构造函数BaseClass virtual,是否有其他方法可以强制采用的move构造函数DerivedClass

Edit1:其他信息-我已经考虑过指针。但问题是,我想将工厂函数导出到DLL中,并且希望对用户来说尽可能地容易。标准指针可能会导致内存泄漏,另一方面,并​​不是每个人都对智能指针熟悉。

Edit2:据我了解,真正的问题是:多态性是否也可以按值返回?
答案是否定的。

c++ virtual factory move

1
推荐指数
1
解决办法
69
查看次数