我是一名学习MFC的学生。
我想声明ChildView区域变量。
我必须在哪里声明变量?头文件?还是cpp文件?
我认为两者都运作良好。但我想知道一般的风格。
请告诉我哪些是可取的。
// ChildView.h : interface of the CChildView class
//
#pragma once
// CChildView window
class CChildView : public CWnd
{
// Construction
public:
CChildView();
...
...
// User variables
public:
CFile* pImgFile = NULL;
ULONGLONG imgLength, frameLength;
unsigned char RRR[288][352];
unsigned char GGG[288][352];
unsigned char BBB[288][352];
unsigned char YYY[288][352];
unsigned char UUU[144][176];
unsigned char VVV[144][176];
};
或
// ChildView.cpp : implementation of the CChildView class
//
#include "stdafx.h"
#include "Doyup_YUV_HW7-8.h"
#include "ChildView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CChildView
CChildView::CChildView()
{
CFile* pImgFile = NULL;
ULONGLONG imgLength, frameLength;
unsigned char RRR[288][352];
unsigned char GGG[288][352];
unsigned char BBB[288][352];
unsigned char YYY[288][352];
unsigned char UUU[144][176];
unsigned char VVV[144][176];
}
此外,我还想知道定义语句的位置。
之后(3)#pragma在头文件中一次?
或之后(9)#endif在cpp文件中?
答案 0 :(得分:2)
您应该更喜欢第二种方式 - 在
中的.cpp文件中声明变量CChildView::CChildView()
仅在你只需要在构造函数中使用变量并且在其他函数中不需要它们的情况下。
但我认为你也需要在其他功能中使用这些变量。在这种情况下,您应该在.h文件中声明它们。现在请注意它们将它们声明为公共变量,这是个坏主意。您最好将它们声明为私有变量(阅读私有和公共变量以及封装)。默认情况下,最好将所有变量声明为私有。
对于定义,最好将它们添加到.cpp文件中,然后它们将仅在您的cpp文件中可见。如果您在h文件中定义某些内容,那么当您包含h文件时,它将在任何地方定义,并可能导致冲突。
答案 1 :(得分:2)
您别无选择,因为您声明它们的地方会极大地影响行为。特别是,变量的生命周期在很大程度上取决于它们的定义位置。
如果在类定义中定义变量(几乎总是在.h文件中),那么它就是一个成员变量。成员的生命周期与包含对象的生命周期相关联。如果你有3个对象,它们每个都有一个唯一的生命周期,因此你有3个每个成员变量的副本和相应的生命周期。
如果在成员函数(通常在.cpp文件中)中定义变量,则生命周期与函数调用匹配。如果您有3个对象,一个线程,并且该一个线程调用成员函数,则在该调用期间获得一个变量。
您还可以在.cpp文件外部成员函数中定义变量。这是一个全局变量,与任何对象或类无关。出于这个原因,全局变量通常被认为是糟糕的风格。
答案 2 :(得分:2)
这不是MFC问题。关于什么是良好的结构化设计和良好的面向对象设计,这是一个很好的问题。
变量生命周期,变量范围(全局,对象,类,函数,块,...)和变量可访问性(包括但不限于类中的公共与受保护与私有成员变量)需要不仅对基本语义有很好的理解,而且还能使一个好的设计变得“好”。
一般规则是,您希望大多数变量的生命周期尽可能短,但只要需要。因此,for循环索引通常可以在函数内的for循环中声明,而不是在类中声明(您只需要循环内的索引,而不是循环外部,而不是类中的其他方法)。但是你希望你的CDocument MFC对象的“modified”标志成为CDocument类的成员,这样CDocument的其他方法可以查看/设置/清除它,然后提供一个公共访问者GetModified()以便其他用户CDocument对象(就像它对应的CView对象一样)可以确定CDocument是否已被“修改”(比如在CView的标题栏文本的末尾添加*以表明它已被修改)。
答案 3 :(得分:1)
这里我们必须指定声明和实现不分别绑定到头文件和cpp文件。 将它们分隔在头文件和cpp文件中是一件好事,但不是限制性的必要条件。
在您的示例中,在"头文件中声明的变量"在类中声明,因此它们是该类的成员,并且您可以从该类的对象中使用它们,在cpp文件中声明的变量在构造函数内声明,因此它们仅在该方法中可用且不能使用其他地方
也是关于范围,头文件中的define可以在包含它的其他文件中使用,但只有在编译器实际到达那一点时才会定义,所以如果你有另一个之前编译过的文件,它不会包含那个定义。您可能也想查看预处理器定义。您可能希望在" stdafx.h"中设置定义。文件。在你的情况下,你似乎并不需要那个定义,因为无论如何你可以使用已经自动声明的_DEBUG。