Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;类方法继承 我最近从java转换到C++,我在解决类继承的工作方面有一些困难。目前,我有类武器和类微型枪Minigun继承了类武器,这意味着它应该具有武器定义的方法和变量。我的问题是,我在武器中有一个名为rate的私有常量static int,还有一个公共方法,返回一个名为getRate()的整数getRate()只返回类中定义的速率变量。当迷你枪扩展武器,并且我在迷你枪中设置了速率时,getRate()方法仍然会从武器类返回常量,即使它是在迷你枪类上调用的。我认为它会像Java一样工作,而编写的方法会在Minigun中使用修改过的变量。目前我必须做以下几点_C++_Inheritance_Methods_Constants_Static Variables - Fatal编程技术网

C++;类方法继承 我最近从java转换到C++,我在解决类继承的工作方面有一些困难。目前,我有类武器和类微型枪Minigun继承了类武器,这意味着它应该具有武器定义的方法和变量。我的问题是,我在武器中有一个名为rate的私有常量static int,还有一个公共方法,返回一个名为getRate()的整数getRate()只返回类中定义的速率变量。当迷你枪扩展武器,并且我在迷你枪中设置了速率时,getRate()方法仍然会从武器类返回常量,即使它是在迷你枪类上调用的。我认为它会像Java一样工作,而编写的方法会在Minigun中使用修改过的变量。目前我必须做以下几点

C++;类方法继承 我最近从java转换到C++,我在解决类继承的工作方面有一些困难。目前,我有类武器和类微型枪Minigun继承了类武器,这意味着它应该具有武器定义的方法和变量。我的问题是,我在武器中有一个名为rate的私有常量static int,还有一个公共方法,返回一个名为getRate()的整数getRate()只返回类中定义的速率变量。当迷你枪扩展武器,并且我在迷你枪中设置了速率时,getRate()方法仍然会从武器类返回常量,即使它是在迷你枪类上调用的。我认为它会像Java一样工作,而编写的方法会在Minigun中使用修改过的变量。目前我必须做以下几点,c++,inheritance,methods,constants,static-variables,C++,Inheritance,Methods,Constants,Static Variables,武器.h #ifndef __WEAPON__ #define __WEAPON__ class Weapon { public: virtual int getRate() { return rate; } private: const static int rate = 0; }; #endif #include "Weapon.h" #ifndef __WEAPON_MINIGU

武器.h

#ifndef __WEAPON__
#define __WEAPON__

class Weapon
{
    public:
        virtual int getRate()
        {
            return rate;
        }
    private:
        const static int rate = 0;
};

#endif
#include "Weapon.h"

#ifndef __WEAPON_MINIGUN__
#define __WEAPON_MINIGUN__

class Minigun: public Weapon
{
public:
    int getRate(); // I have to define this here, and create it inside Minigun.cpp
private:
    const static int rate = 30;
};

#endif
Minigun.h

#ifndef __WEAPON__
#define __WEAPON__

class Weapon
{
    public:
        virtual int getRate()
        {
            return rate;
        }
    private:
        const static int rate = 0;
};

#endif
#include "Weapon.h"

#ifndef __WEAPON_MINIGUN__
#define __WEAPON_MINIGUN__

class Minigun: public Weapon
{
public:
    int getRate(); // I have to define this here, and create it inside Minigun.cpp
private:
    const static int rate = 30;
};

#endif
Minigun.cpp

#include "Minigun.h"

int Minigun::getRate() // Is there a way so I do not need to type this out for every class that extends Weapon?
{
    return rate;
}

武器
实例将通过
getRate()
返回
武器::速率
,而
迷你枪
实例将返回
迷你枪::速率
的速率

因为方法
getRate()
是虚拟的
武器
指针或对
Minigun
实例的引用将返回
Minigun::rate

如果派生类中只有速率变量发生变化,那么模板类所需的编码将少于动态多态版本。模板版本如下所示:

    template<int Rate = 0>
    class Weapon
    {
        public:
            int getRate() // no need for virtual anymore
            {
                return rate;
            }
        private:
            const static int rate = Rate;
    };

    class Minigun: public Weapon<30> {};
模板
阶级武器
{
公众:
int getRate()//不再需要虚拟
{
回报率;
}
私人:
常数静态整数速率=速率;
};
小型机枪类:公共武器{};

不要让它是静态的。例如:

#include <iostream>

class Weapon {
    public:
       Weapon();
       virtual int Rate();
       virtual void Rate(int r);
    protected:
       int rate;
};

Weapon::Weapon() {
    rate = 10;
}

class Minigun : public Weapon {
    public: 
         Minigun();
};

Minigun::Minigun() {
    rate = 30;
}

int Weapon::Rate() {
    return rate;
}
void Weapon::Rate(int r) {
    rate = r;
}

int main() {
    Minigun ThisGun;
    Weapon AnyGun;
    std::cout << ThisGun.Rate() << std::endl;
    std::cout << AnyGun.Rate() << std::endl;
    AnyGun.Rate(15);
    std::cout << AnyGun.Rate() << std::endl;

    return 0;
}

尝试
return Minigun::rate在minigun.cpp中。不gaurentee@Chemistpp我的Minigun.cpp工作正常,我希望从Minigun.cpp中完全删除getRate()函数,并使用Weaponremove rate from class Minigun中已经定义的函数和getRate函数。在minigun上调用这些函数时,它们只会调用继承的函数。当我删除这些函数时,会调用武器内部的getRate()(这是我想要的),但它会从基本武器类内部返回“rate”常量,而不是minigun内部的常量。我不确定重载是否适用于静态类成员变量,但是,如果它是常量,为什么不直接使用一个返回值的函数(例如,
return30;
)呢?我试图避免在构造函数中设置变量(我不记得为什么了,关于将变量分开的事)。然而,这似乎是实现我想要的最好方式。谢谢:)我的版本似乎仍然有问题。当将构造函数
Minigun::Minigun(){rate=30}
放在Minigun.cpp中时,我得到一个错误,指出
武器::rate
是私有的。除了使用setter/getter组合,我还能做什么呢?
protected:
确保声明为“如果确实需要速率私有”,请创建一个受保护(或公共)的setter。