精华内容
下载资源
问答
  • C++ 类声明 前置声明范例

    千次阅读 2019-07-19 18:47:40
    在编写C++程序的时候,偶尔需要用到前置声明(Forward declaration)。下面的程序中,带注释的那行就是B的前置说明。这是必须的,因为A中用到了B,而B的声明出现在A的后面。如果没有B的前置说明,下面的...

    转载自http://www.cnblogs.com/staring-hxs/p/3244251.html

    在编写C++程序的时候,偶尔需要用到前置声明(Forward declaration)。下面的程序中,带注释的那行就是类B的前置说明。这是必须的,因为类A中用到了类B,而类B的声明出现在类A的后面。如果没有类B的前置说明,下面的程序将不同通过编译,编译器将会给出类似“缺少类型说明符”这样的出错提示。

    代码一:
    
    // ForwardDeclaration.h
    #include <iostream>
    using namespace std;
    class B;             // 这是前置声明(Forward declaration)
    class A
    {
    private:
             B* b;
    public:
             A(B* b):b(b){}
    };
    
    class B
    {
    };
    
    // Main.cpp
    #include "ForwardDeclaration.h"
    int main(int argc, char** argv)
    {
             B* b = new B();
             A* a = new A(b);
             delete a;
             delete b;
             return 0;
    }

    上面程序可以顺利编译和运行(几乎没有做什么,也没有输出)。

    是不是有了前置说明就万事大吉了呢?我们看看下面的代码(带阴影部分的代码是新增加的):

    代码二:
    
    
    // ForwardDeclaration.h
    #include <iostream>
    using namespace std;
    class B;             // 这是前置声明(Forward declaration)
    class A
    {
    private:
             B* b;
    public:
             A(B* b):b(b){}
            void someMethod()
             {
                b->someMethod();                                                  // (1)
             }
    };
    
    class B
    {
    public:
          void someMethod()
           {
              cout << "something happened..." << endl;
           }
    };
    // Main.cpp
    #include "ForwardDeclaration.h"
    int main(int argc, char** argv)
    {
             B* b = new B();
             A* a = new A(b);
        a->someMethod();
        delete a;
        delete b;
        return 0;
    }

    一编译,发现代码(1)处出错。出错提示往往包括(不同的编译器给出的提示会有所不同):

    1. 使用了未定义的类型B;

    2. “->somemethod”的左边必须指向类/结构/联合/泛型类型

    原因:

    1. (1)处使用了类型B的定义,因为调用了类B中的一个成员函数。前置声明class B;仅仅声明了有一个B这样的类型,而并没有给出相关的定义,类B的相关定义,是在类A后面出现的,因此出现了编译错误;

    2. 代码一之所以能够通过编译,是因为其中仅仅用到B这个类型,并没有用到类B的定义。

    解决办法是什么?

    将类的声明和类的实现(即类的定义)分离。如下所示:

    // ForwardDeclaration.h   类的声明
    #include <iostream>
    using namespace std;
    class B;             // 这是前置声明(Forward declaration)
    class A
    {
    private:
             B* b;
    public:
            A(B* b);
    void someMethod();
    };
    
    class B
    {
    public:
    void someMethod();
    };
    // ForwardDeclaration.cpp        类的实现
    #include "ForwardDeclaration.h"
    A::A(B* b):b(b)
    {
    
    }
    
    void A::someMethod()
    {
        b->someMethod();
    }
    
    void B::someMethod()
    {
        cout << "something happened..." << endl;
    }
    // Main.cpp
    #include "ForwardDeclaration.h"
    int main(int argc, char** argv)
    {
             B* b = new B();
             A* a = new A(b);
             a->someMethod();
         delete a;
             delete b;
         return 0;
    }

    结论:

    前置声明只能作为指针或引用,不能定义类的对象,自然也就不能调用对象中的方法了。

    而且需要注意,如果将类A的成员变量B* b;改写成B& b;的话,必须要将b在A类的构造函数中,采用初始化列表的方式初始化,否则也会出错。关于这点

    展开全文
  • C++ 类声明 前置声明

    千次阅读 2017-11-16 16:21:13
    参考自:... 关于前置类型声明的注意点: 代码一: class B; class A { public: B* aData; A(B* b) :aData(b) {} }; class B {}; 上述代码能够通过编译。 代码二: class B;

    参考自:https://www.cnblogs.com/fwycmengsoft/p/4061989.html

    关于前置类型声明的注意点:


    代码一:

    class B;

    class A
    {
    public:
    B* aData;
    A(B* b) :aData(b) {}
    };

    class B {};

    上述代码能够通过编译。


    代码二:

    class B;

    class A
    {
    public:
    B aData;
    A(B b) :aData(b) {}
    };

    class B {};

    上述代码报错。Error List:

    C2079 'A::aData' uses undefined class 'B'

    C2027 use of undefined type 'B'

    C2439 ‘A::aData': member could not be initialized


    问题总结:上述两段代码中仅仅相关了一个指针,而编译结果不同。

    结论:前置类型声明只能作为指针或者引用,不能定义类的对象,所以也不能调用对象中的方法(包括构造函数)。

    展开全文
  • C++类的定义和声明

    千次阅读 2019-05-27 16:08:30
    C++中最重要的特征,最简单地说,就是定义了一个新的类型和一个新作用域。每个可以没有成员,也可以定义多个成员,成员可以是数据,函数或类型别名。 一个可以包含若干(public)公有的、私有的(private...

         类是C++中最重要的特征,最简单地说,类就是定义了一个新的类型和一个新作用域。每个类可以没有成员,也可以定义多个成员,成员可以是数据,函数或类型别名。

         一个类可以包含若干(public)公有的、私有的(private)和受保护的(protected)部分,公有的可被使用该类型的所有代码访问,私有的可以被其他类成员访问,所有成员必须在类的内部声明

    class Sales_item { 
    public: 
        // 对Sales_item 对象操作
        double avg_price() const; //在类外部定义的成员函数必须指明它们是在类的作用域中。
        bool same_isbn(const Sales_item &rhs) const 
            { return isbn == rhs.isbn; } 
        // 初始化内置类型成员所需的默认构造函数
        Sales_item(): units_sold(0), revenue(0.0) { } 
        //创建一个类类型的对象时,编译器会自动使用一个构造函数
    来初始化该对象。构造函数是一个特殊的、与类同名的成员函数,用于给每个数
    据成员设置适当的初始值。
    private: 
         std::string isbn; 
         unsigned units_sold; 
         double revenue; 
    }; 
    double Sales_item::avg_price() const 
    { 
       if (units_sold) 
       547
       return revenue/units_sold; 
       else 
       return 0; 
    }

     

    展开全文
  • C++类声明和定义

    千次阅读 2019-05-20 12:10:13
    这里将采取比较规整的方式来解决这个的构建问题。 // Date.h #include <iostream> using namespace std; class Date { public: Date(); //这是默认的构造函数 //如果有兴趣的话,可以理解下,...

    这里将采取比较规整的方式来解决这个类的构建问题。

    // Date.h
    #include <iostream>
    using namespace std;
    
    class Date
    {
      public:
        Date();  //这是默认的构造函数
        //如果有兴趣的话,可以理解下,构造函数自定义的和默认的区别
        Date(int y, int m, int d);     //自定义构造函数声明
        void Set(int m, int d, int y);
        void Print();
    
      private:
        int year, month, day;
    };
    

    类中的成员函数的定义,可以在类的内部,也可以在类的外部,这是两种类的成员函数的定义方式。因为构造函数也是类内成员函数,自然也可以在类外进行定义,以个人经历建议,大家都在用类外定义的方式,这样就会显得层次比较清晰,不会那么让一个类很臃肿。

    //Date.cpp
    #include "Date1.h"
    
    Date::Date(int y, int m, int d)
    {
       this->year = y;   // 类的内部的this是可以不用写的,如果不明白可以自行详细了解下
        month = m;
        day = d;
    }
    
    void Date::Set(int y, int m, int d)
    {
        year = y;
        month = m;
        day = d;
    }
    
    void Date::Print()
    {
        cout << year << "." << month << "." << day << endl;
    }
    
    int main()
    {
        Date today(2017, 7, 10);
        today.Print();
        Date tomorrow(2017, 7, 11);
        tomorrow.Print();
        Date *pas = new Date(2019, 5, 22);
        pas->Print();
        
        return 0;
    }
    

    运行结果

    2019/ 5/ 20
    2019/ 5/ 21
    2019/ 5/ 22
    
    展开全文
  • c++声明和实现

    千次阅读 2019-11-08 18:59:16
    (1) 当c++声明和实现放在一个中时,c++编译器会把函数当成内联函数来对待,如下面的getR函数,c++编译器就会把其当成一个内联函数。 class Circle { public: double r; double s; public: double get...
  • C++中的——的定义和声明

    万次阅读 多人点赞 2018-08-23 10:49:04
    在以面向对象的方式开发应用程序时,将遇到的各种事物抽象为中通常包含数据和操作数据的方法,用户通过实例化对象来访问中的数据和方法。 一、的定义 class/struct 类名 //头 {数据和方法的定义...
  • C++ 静态成员变量声明和定义

    千次阅读 2018-11-04 16:45:36
    这是在学习C++类中的一个简单总结 静态成员变量的声明和定义的
  • C++类的定义和声明怎么写

    千次阅读 2019-01-08 17:42:59
    C++语言可以看成是C语言的扩展和改进,相对于C语言,C++语言主要是增添了面向对象的特性。(Class)则是C++面向对象编程的实现方式。 无论是何种编程语言,进行面向...首先我们来了解一下声明,先来看一个例子...
  • C++类变量声明

    千次阅读 2015-12-04 17:00:56
    C++声明一个变量,会自动创建一个对象,无需像java一样需要调用new,写了个demo做了验证://child.h #include "Parent.h" class Child:private Parent { public: int a; Child(); ~Child(); }; //child.cpp #...
  • C++声明的实现分开

    万次阅读 2017-02-09 18:07:17
    首先我们要先创建一个项目,名为Test2(这是我的项目名字)这里不做过多的解释,使用vs应该都会创建项目(我是创建的C++的项目,所以选择Win32控制台应用程序,创建的空项目) 然后右击项目名称—添加,点击创建...
  • 在cocoa中声明一个,出现error: new types may not be defined in a return type这样的错误语句,原因是类声明结束后面的大括号没有分号“;”
  • //里允许使用多个private,可以清晰的告诉自己是在后来加上去的,(方法同) public: Square()//用构造函数给的成员进行初始化,与类名相同,可以自动运行,无返回值类型,可以重载 { n=100;//做缺省值,直接...
  • c++友元类声明及其调用

    千次阅读 2017-09-26 11:19:28
    c++友元的相关理解及定义使用!!!
  • c++模板类声明和定义的问题

    千次阅读 2019-08-18 21:38:39
    这里在学习的过程中遇到的一些问题,比较简单,但还是记下来,以免下次遇到这个问题再犯,大佬们可跳过哦。先简单的介绍下模板的概念 C++模板(泛型编程) c++模板是泛型编程的基础,所谓...模板模板的概念 一个...
  • [C++]模板声明与实现分离问题

    千次阅读 2017-06-01 16:52:55
    本文,记录C++模板的实现。 目的:实现一个bag 做法:模板bag的声明与实现分离,也就是.cpp和.h文件分离 ...C++ 中的模板类声明头文件和实现文件分离后,如何能实现正常编译? ,链接Splitting temp
  • C++通过及相关的封装、继承、多态和虚函数机制支持面向对象的程序设计和开发。...C++声明(也又称)式如下:class 类名 { 访问范围说明符: 成员变量1; 成员变量2; ... 成员函数1声明; 成员函数1定义;
  • 此篇文章介绍内静态常量定义和声明的用法,在编程时经常遇到需要定义一个常量,而且如果要确保其的有效性在某个范围内,则需要将其定义在一个class内。而其用法常会遇到一些问题,下面简要说明其中会遇到的一个...
  • c++中的指针

    千次阅读 多人点赞 2018-08-30 14:55:50
    转自:https://www.cnblogs.com/yedushusheng/p/5524043.html 代码: Student a; s.setName("A"); //Studeng *b = new Student(); Student *b;...定义对象基本格式是:Student ...
  •  当一个被多个程序使用时,一般将声明(包含成员函数的声明)放在指定的头文件中,用户编程时,只需将这个头文件包含进来,而不必在每个使用该的程序中重复书写其声明。而成员函数的定义则在另一个源文件中...
  • C++类的前置声明

    千次阅读 2018-03-27 13:57:40
    前置声明是指对、函数、模板或者结构体进行声明,仅仅是声明,不包含相关具体的定义。在很多场合我们可以用前置声明来代替#include语句。 的前置声明只是告诉编译器这是一个类型,但无法告知类型的大小,成员等...
  • C/C++声明和定义

    千次阅读 2016-10-04 01:42:04
    1.声明和定义 以Sales_item的定义来举例说明: //Sales_item.h文件 //Sales_item的声明 class Sales_item { public: //Sales_item的构造函数 Sales_item(): units_sold(0), revenue(0.0) {} //成员...
  • 有人说在声明的时候初始化相当于在构造函数中初始化,其实不是的,成员变量初始化的顺序为:先进行声明时初始化,然后进行初始化列表初始化,最后进行构造函数初始化,如下代码:(另外初始化列表中初始化的顺序是和...
  • C++ 声明与定义的区别

    千次阅读 2017-07-21 15:35:47
    一,声明与定义的区别 声明是将一个名称引入程序。定义提供了一个实体在程序中的唯一描述,涉及到内存空间的分配以及初始值的设定。声明和定义有时是同时存在的。 1,定义也是声明,extern声明不是定义,即不分配...
  • C++头文件定义的方法

    万次阅读 多人点赞 2019-06-29 16:52:57
    新手在写C++程序定义类的时候,可能会犯一个错误,就是在main函数文件里定义很多类,一个文件中包含很多函数,这样程序看起来很冗杂。今天总结一下如何在C++中使用...头文件中一般是声明类,包括类的成员,方法,还...
  • C++在命名空间中声明类和成员函数

    千次阅读 2017-04-06 17:22:11
    C++在命名空间中声明类和成员函数 标签: c++名称空间类 2014-04-14 17:10 1632人阅读 评论(0) 收藏 举报  分类: C++(71)  来源:网络 作者:未知 虽然很多程序员都熟悉名字...
  • test.hpp #include #include #include #include #include "test.hpp" using namespace std; oneclazz::oneclazz(int input){ // 做些初始化相关的事 } bool oneclazz::isProcessOk(){ ...}
  • C++C++类的定义和对象的创建

    千次阅读 2018-10-11 12:38:43
    是创建对象的模板,一个可以创建多个对象,每个对象都是类型的一个变量;创建对象的过程也叫的实例化。...class是 C++ 中新增的关键字,专门用来定义。     只是一个模板(Template),...
  • c++ 模板 声明和定义都放在.h文件的原因

    千次阅读 多人点赞 2014-03-20 00:29:11
    这样连接器只要在test.obj的符号导出表中寻找符号f(当然C++对f作了mangling)的地址就行了,然后作一些偏移量处理后(因为是将两个.obj文件合并,当然地址会有一定的偏移,这个连接器清楚)写入main.obj中的符号...
  • c++中如何一个批量声明多个对象

    千次阅读 2017-06-06 10:22:26
  • 今天编写数组链表的程序,出现了一个问题,我在ArrayList.h中定义了一个模板ArrayList,然后按照原来的习惯,在另一个源文件ArrayList.cpp中对模板的成员函数进行定义,编译也通过了,但是当我在main函数对模板...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 558,582
精华内容 223,432
关键字:

c++类的声明

c++ 订阅