• 6830阅读
  • 13回复

[讨论]C++对象定义问题 [复制链接]

上一主题 下一主题
离线icyrat
 

只看楼主 倒序阅读 楼主  发表于: 2011-12-16
弱弱的问一下, 我打算在一个类里面定义一个QFile对象,即在这个类都可以访问这个对象,但不是指针
我在头文件里这样声明
private:
          QFile file;
在构造函数里应该怎么样定义?
     我现在这样是可以的
     file.setFileName("xx.txt");
          但是这样的话就不行
     QFile file("xx.txt");
通过阅读C++书籍知道,变量的声明在头文件,定义应该咋构造函数,但是这个QFile应该怎么样定义以及声明??? 先道一声歇歇。
    
离线lejcey

只看该作者 1楼 发表于: 2011-12-16
.h:
private:
          QFile *file;

.cpp:

file = new QFile("filename.ext");

以指针方式集成。
离线uidab

只看该作者 2楼 发表于: 2011-12-16
回 楼主(icyrat) 的帖子
你在头文件里声明的应该是类的成员变量(有的书上叫属性),那已经可以理解为一种定义了!它的作用域和你在某个类的成员函数里定义或声明的变量是不一样的。
我不知道你说的那本C++的书是什么,如果他真这么说也是有条件的,或者他在胡说。你还是看看C++ Primer吧,如果不想看英文,有中文版的。
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线uidab

只看该作者 3楼 发表于: 2011-12-16
回 楼主(icyrat) 的帖子
重要理解

变量声明时不分配存储空间,而定义时分配空间。

这个对于指针是需要分开理解的,而对于非指针,我个人常常是理解成一起。
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线lejcey

只看该作者 4楼 发表于: 2011-12-16
写个例子让你理解一下:

  1. #include <iostream>
  2. class A{
  3. private:
  4.     int *aa;
  5. public:
  6.     A(int i){aa = new int; *aa = i;}
  7.     A(){aa = new int(0);} // 默认构造函数
  8.     void SetAA(int i){*aa = i;}
  9.     int GetAA(){return *aa;}
  10.     ~A(){delete aa;}
  11. };
  12. class B{
  13. private:
  14.     // 楼主所说的方式,这里只能定义,
  15.     A ca;
  16. public:
  17.     // 在构造函数中使用ca,而不是定义ca, ca已经定义并调用了默认构造函数
  18.     B(int i) {ca.SetAA(i);}
  19.     B() {};
  20.     void SetCA(int i) {ca.SetAA(i);}
  21.     int GetCA(){return ca.GetAA();}
  22. };
  23. int main(){
  24.    B cb, cb2;
  25.    cb.SetCA(520);
  26.    std::cout << cb.GetCA() << '\t' << cb2.GetCA() << std::endl;
  27.    return 0;
  28. }

运行结果:
  1. 520     0

另:代码不能高亮吗?


离线roywillow

只看该作者 5楼 发表于: 2011-12-16
如果在类定义中写
private:
    QFile file;
我个人认为这个file变量其实在构造函数调用之前就已经实例化了
而如果在构造函数中再来一个QFile file("XX"),这只相当于在构造函数作用范围内声明了一个新变量罢了,对类声明中的那个变量没啥影响

而如果是
private:
    QFile *file;
那么类实例化的时候只是会实例一个指针变量,而这个指针究竟要指向哪里,则需要你对其进行赋值
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线icyrat

只看该作者 6楼 发表于: 2011-12-19
回 1楼(lejcey) 的帖子
这个我也理解,应该自己手动释放空间吧,在析构函数。
离线icyrat

只看该作者 7楼 发表于: 2011-12-19
回 2楼(uidab) 的帖子
C++ Primer说 int i; 是声明也是定义。 extern int i; 只是声明。
离线icyrat

只看该作者 8楼 发表于: 2011-12-19
回 4楼(lejcey) 的帖子
恩,是定义了
离线icyrat

只看该作者 9楼 发表于: 2011-12-19
回 5楼(roywillow) 的帖子
哦了,学习了。
离线uidab

只看该作者 10楼 发表于: 2011-12-19
回 7楼(icyrat) 的帖子
你这个例子没错,呵呵,但是很多小项目用到 extern int i; 的可能性很小。
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线XChinux

只看该作者 11楼 发表于: 2011-12-19
楼主现在要的只是如何初始化的问题吧?


class Class1
{
public:
   Class1();
   ~Class1();
private
    QFile _file;
};

==========================

Class1::Class1() : _file("/your/file/path")
{
}

Class1::~Class1()
{
}

==========
上面的_file("/your/file/path"),是调用的对应的构造函数。
如果不写这个,那么 _file构造时是调用的默认构造函数。


二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线roywillow

只看该作者 12楼 发表于: 2011-12-19
引用第11楼XChinux于2011-12-19 22:10发表的  :
楼主现在要的只是如何初始化的问题吧?
class Class1
{
.......



惭愧……原来也可以这样初始化啊……
C++基础果然还不够……
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线xiaoxianlg
只看该作者 13楼 发表于: 2012-05-31
回 12楼(roywillow) 的帖子
C++ PRIMER里面曾经说到,类的初始化列表是很多资深C++程序员都无法熟练运用的一个好方法。。。
关于两种生成对象的方法,我发一个自己的总结:
(1)在c++的类中,我如果要访问类中的成员变量或函数,有2种方法,第一种就是定义一个一个对象,如:
Class A ...  
A aa;
aa.xxx();

另外一种就是
Class B ...
B *aa = new B();
aa->xxx();

(2)在java中,A a = new A()
c++中等同于 A a;
另外在c++中还有另外一种声明和实例化就是使用指针,如:A* a= new A()
c++中的A a;就已经构造了对象;
而在java中 A a; 就是声明,还没有分配空间,如果要继续分配空间必须像上面一样new A();
在c++中就非常的灵活,A a;在栈(stack)上分配空间,是静态的
A *a= new A;在堆(heap)上分配空间,是动态的

栈上空间自动回收,堆空间需要程序员手动回收
(3)静态分配内存适合于编译时就已经可以确定需要占用内存多少的情况,而在编译时不能确定内存需求量时可使用动态分配内存;但静态分配内存的运行效率要比动态分配内存的效率要高,因为动态内存分配与释放需要额外的开销;动态内存管理水平严重依赖于程序员的水平,如果处理不当容易造成内存泄漏。
可以知道动态内存分配相对于静态内存分配的特点:
  1、不需要预先分配存储空间;
  2、分配的空间可以根据程序的需要扩大或缩小。
  要实现根据程序的需要动态分配存储空间,就必须用到malloc函数.

ps: C++: A a =new A(); 会报错
                A *a=new A();
                a.run();//会报错(所以必须用a->run())
所以,在程序中必须考虑用指针并且动态分配内存的情况下还能防止内存泄露......        
快速回复
限100 字节
 
上一个 下一个