代码之家  ›  专栏  ›  技术社区  ›  Kevin Meredith

返回对象的C++函数

c++
  •  16
  • Kevin Meredith  · 技术社区  · 14 年前
    // Assume class definition for Cat is here.
    
    Cat makeCat() {
        Cat lady = new Cat("fluffy");
        return lady;
    }
    
    int main (...) {
        Cat molly = makeCat();
        molly->eatFood(); 
        return 0;
    }
    

    会有一个 上的错误 molly->eatFood()

    7 回复  |  直到 14 年前
        1
  •  27
  •   Notinlist    14 年前

    更正了您的程序并创建了 class Cat :

    #include <iostream>
    #include <string>
    
    class Cat {
    public:
            Cat(const std::string& name_ = "Kitty")
            : name(name_)
            {
                    std::cout << "Cat " << name << " created." << std::endl;
            }
            ~Cat(){
                    std::cout << "Cat " << name << " destroyed." << std::endl;
            }
            void eatFood(){
                    std::cout << "Food eaten by cat named " << name << "." << std::endl;
            }
    private:
            std::string name;
    };
    
    Cat* makeCat1() {
            return new Cat("Cat1");
    }
    
    Cat makeCat2() {
            return Cat("Cat2");
    }
    
    int main (){
            Cat kit = makeCat2();
            kit.eatFood();
    
            Cat *molly = makeCat1();
            molly->eatFood();
            delete molly;
    
            return 0;
    }
    

    Cat Cat2 created.
    Food eaten by cat named Cat2.
    Cat Cat1 created.
    Food eaten by cat named Cat1.
    Cat Cat1 destroyed.
    Cat Cat2 destroyed.
    

    我建议你继续学习C++ Cover to Cover商店的基础书籍。

        2
  •  8
  •   jwueller    14 年前

    new Cat("fluffy") 创建指针。您需要指定 Cat* 作为返回类型。由于对象是在堆中创建的,因此在函数返回后它仍然可用。

        3
  •  5
  •   sbi    14 年前

    new )那你需要打电话 delete

    您还有很多语法错误,请在下面更正。

    Cat* makeCat() 
    {
      Cat *lady = new Cat("fluffy");
      return lady;
    }
    
    int main (int argc, char** argv) 
    {
    
      Cat* molly = makeCat();
      molly->eatFood(); 
    
      delete molly;//This was added
      return 0;
    }
    
        4
  •  3
  •   Starkey    14 年前

    lady 在堆上创建(使用 new makeCat 方法。所以电话接通了 molly 完全有效。

    在使用它之后(将来的某个时候),因为你的程序结束了,这不是什么大问题。在一个更大的项目中,这将是一个非常大的问题。

        5
  •  2
  •   pascal    14 年前

        6
  •  2
  •   koresh    7 年前

    如果您的编译器支持c++11,您可以在此处使用unique\u ptr:

    #include <iostream>
    #include <memory>
    
    using namespace std;
    class Cat {
        public:
            Cat() {
                cout << "Cat created" << endl;
            }
            ~Cat() {
                cout << "Cat destroyed" << endl;
            }
            void eatFood() {
                cout << "Cat is eating food" << endl;
            }
    };
    
    unique_ptr<Cat> makeCat() {
        unique_ptr<Cat> lady( new Cat );
        return lady;
    }
    
    int main () {
        unique_ptr<Cat> molly = makeCat();
        molly->eatFood();
        return 0;
    }
    

    现在,您不必担心删除创建的对象。一旦molly指针超出范围,它就会被删除:

    Cat created
    Cat is eating food
    Cat destroyed
    
        7
  •  0
  •   Eiko    14 年前

    Cat *lady Cat *molly ,否则应该没问题。