根据程序员的哲学,我想知道在哪里声明变量
I'd like to know where to declare variables, according to philosophy of programmers
我是一名学习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];
}
另外,我也想知道define语句在哪里。
在头文件中 (3)#pragma once 之后?
或在 cpp 文件中的 (9)#endif 之后?
您应该更喜欢第二种方式 - 在
的 .cpp 文件中声明变量
CChildView::CChildView()
仅在您仅在构造函数中需要变量而在其他函数中不需要它们的情况下。
但我认为您在其他函数中也需要这些变量。在这种情况下,您应该在 .h 文件中声明它们。请注意它们,现在您将它们声明为 public 变量,这是个坏主意。您最好将它们声明为私有变量(阅读有关私有和 public 变量和封装的信息)。默认情况下,最好将所有变量声明为私有。
至于定义,最好将它们添加到.cpp 文件中,然后它们将只在您的cpp 文件中可见。如果你在 h 文件中定义了一些东西,当你包含你的 h 文件时,它会在任何地方定义并且可能导致冲突。
我必须在哪里声明变量?头文件?或 cpp 文件?
这里我们必须指定声明和实现不分别绑定到头文件和cpp文件。
将它们在头文件和 cpp 文件中分开是一件好事,但不是绝对必要的。
可变范围
在您的示例中,在 "header file" 中声明的变量在 class 中声明,因此它们是 class 的成员,您可以从 class 的对象中使用它们 class, 在 cpp 文件中声明的变量是在构造函数中声明的,因此它们只能在该方法中可用,不能在其他任何地方使用
我在哪里使用定义?
这也是关于作用域的,头文件中的定义可以在包含它的其他文件中使用,但它只会在编译器实际到达那个点时被定义,所以如果你有另一个文件是编译之前,它不会包含那个定义。您可能还想查看预处理器定义。您可能希望在 "stdafx.h" 文件中设置您的定义。在您的情况下,您似乎并不需要该定义,因为无论如何您都可以使用已经自动声明的 _DEBUG。
你别无选择,因为声明它们的地方会极大地影响行为。特别是,变量的生命周期在很大程度上取决于它们定义的位置。
如果您在 class 定义中定义变量(几乎总是在 .h 文件中),那么它就是一个成员变量。成员的生命周期与包含 对象 的生命周期相关联。如果你有 3 个对象,它们每个都有一个唯一的生命周期,因此你有每个成员变量的 3 个副本和相应的生命周期。
如果您在成员函数(通常在 .cpp 文件中)中定义变量,则生命周期与函数调用相匹配。如果您有 3 个对象,一个线程,并且该线程调用成员函数,那么在该调用期间您将获得一个变量。
您还可以在成员函数外部.cpp 文件中定义变量。这是一个 全局 变量,不与任何对象或 class 关联。出于这个原因,全局变量通常被认为是糟糕的风格。
这不是 MFC 问题。这是一个很好的问题,关于什么是好的结构化设计和好的 object 导向设计。
变量生命周期、变量作用域(全局、object、class、函数、块...)和变量可访问性(包括但不限于public vs. protected vs. private 成员变量 class) 不仅需要很好地理解基本语义,还需要很好地理解什么是好的设计 "good".
一般规则是您希望大多数变量的生命周期尽可能短,但只要需要就可以。因此,通常可以在函数内的 for-loop 内声明 for-loop 索引,而不是在 class 内声明(您只需要循环内的索引,而不是循环外的索引,而不是循环内的索引class 中的其他方法)。但是您希望 CDocument MFC object 的 "modified" 标志成为 CDocument class 的成员,以便 CDocument 的其他方法可以查看 at/set/clear 它,然后提供public 访问器 GetModified() 以便 CDocument object 的其他用户(如其相应的 CView object)可以确定 CDocument 是否已经 "modified" (比如放置一个* 在 CView 的标题栏文本末尾显示它已被修改)。
我是一名学习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];
}
另外,我也想知道define语句在哪里。
在头文件中 (3)#pragma once 之后?
或在 cpp 文件中的 (9)#endif 之后?
您应该更喜欢第二种方式 - 在
的 .cpp 文件中声明变量CChildView::CChildView()
仅在您仅在构造函数中需要变量而在其他函数中不需要它们的情况下。
但我认为您在其他函数中也需要这些变量。在这种情况下,您应该在 .h 文件中声明它们。请注意它们,现在您将它们声明为 public 变量,这是个坏主意。您最好将它们声明为私有变量(阅读有关私有和 public 变量和封装的信息)。默认情况下,最好将所有变量声明为私有。
至于定义,最好将它们添加到.cpp 文件中,然后它们将只在您的cpp 文件中可见。如果你在 h 文件中定义了一些东西,当你包含你的 h 文件时,它会在任何地方定义并且可能导致冲突。
我必须在哪里声明变量?头文件?或 cpp 文件?
这里我们必须指定声明和实现不分别绑定到头文件和cpp文件。 将它们在头文件和 cpp 文件中分开是一件好事,但不是绝对必要的。
可变范围
在您的示例中,在 "header file" 中声明的变量在 class 中声明,因此它们是 class 的成员,您可以从 class 的对象中使用它们 class, 在 cpp 文件中声明的变量是在构造函数中声明的,因此它们只能在该方法中可用,不能在其他任何地方使用
我在哪里使用定义?
这也是关于作用域的,头文件中的定义可以在包含它的其他文件中使用,但它只会在编译器实际到达那个点时被定义,所以如果你有另一个文件是编译之前,它不会包含那个定义。您可能还想查看预处理器定义。您可能希望在 "stdafx.h" 文件中设置您的定义。在您的情况下,您似乎并不需要该定义,因为无论如何您都可以使用已经自动声明的 _DEBUG。
你别无选择,因为声明它们的地方会极大地影响行为。特别是,变量的生命周期在很大程度上取决于它们定义的位置。
如果您在 class 定义中定义变量(几乎总是在 .h 文件中),那么它就是一个成员变量。成员的生命周期与包含 对象 的生命周期相关联。如果你有 3 个对象,它们每个都有一个唯一的生命周期,因此你有每个成员变量的 3 个副本和相应的生命周期。
如果您在成员函数(通常在 .cpp 文件中)中定义变量,则生命周期与函数调用相匹配。如果您有 3 个对象,一个线程,并且该线程调用成员函数,那么在该调用期间您将获得一个变量。
您还可以在成员函数外部.cpp 文件中定义变量。这是一个 全局 变量,不与任何对象或 class 关联。出于这个原因,全局变量通常被认为是糟糕的风格。
这不是 MFC 问题。这是一个很好的问题,关于什么是好的结构化设计和好的 object 导向设计。
变量生命周期、变量作用域(全局、object、class、函数、块...)和变量可访问性(包括但不限于public vs. protected vs. private 成员变量 class) 不仅需要很好地理解基本语义,还需要很好地理解什么是好的设计 "good".
一般规则是您希望大多数变量的生命周期尽可能短,但只要需要就可以。因此,通常可以在函数内的 for-loop 内声明 for-loop 索引,而不是在 class 内声明(您只需要循环内的索引,而不是循环外的索引,而不是循环内的索引class 中的其他方法)。但是您希望 CDocument MFC object 的 "modified" 标志成为 CDocument class 的成员,以便 CDocument 的其他方法可以查看 at/set/clear 它,然后提供public 访问器 GetModified() 以便 CDocument object 的其他用户(如其相应的 CView object)可以确定 CDocument 是否已经 "modified" (比如放置一个* 在 CView 的标题栏文本末尾显示它已被修改)。