C++ 实现不使用全局声明的函数
Posted
技术标签:
【中文标题】C++ 实现不使用全局声明的函数【英文标题】:C++ Implementing Functions that don't utilize global declarations 【发布时间】:2012-11-05 05:43:32 【问题描述】:我的代码已经可以运行了,请看这里:http://pastebin.com/mekKRQkG
现在,我的函数可以工作,但我猜想使用我声明的 globally
的信息,我想将它们转换为 lines 11-15
上的格式,但我不确定如何将它们转换为这样做。简而言之,我正在尝试将我的功能转换为
"void add_county_election_file"
格式为
"void add_county_election_file(const string, const vector &, const vector &, const vector &, const vector &)"
我不知道从哪里开始,甚至不知道如何开始。
有人可以帮我看看我如何为第一个函数执行此操作,以便我可以全面实施它吗?
谢谢大家!
【问题讨论】:
【参考方案1】:您的函数声明应如下所示:
void add_county_election_file(const string, vector<int>&, vector<string>..);
确保你的向量模板的参数列表是正确的(那是你放在 之间的类型)
然后将你的函数的实现与声明相匹配:
void add_county_election_file(const string, vector<int>&, vector<string>..)...
现在在 main 中使用适当的参数调用您的函数:
string s;
vector<int> arg;
vector<string> sv;
void someFunction (s, arg, sv ...);
【讨论】:
【参考方案2】:我认为您声明的功能是正确的
void add_county_election_file(const string, vector<int>&, vector<int>&,..);
所以你只需要使用所需的参数调用上述函数,因为现在你没有传递参数并且你当前的定义不接受任何参数。
作为一种好的做法,在您的 int main()
函数中,您可以使用 switch
而不是使用 if else
。
【讨论】:
【参考方案3】: 将变量和函数存储在一个类中,重载运算符并创建函数来访问这些变量。在int main()
中声明所有变量并设置要传递给每个函数的参数,例如
void print_results()
修改成
void print_results(std::vector<int> vec, int nCount, etc..)
与第一个类似,创建一个结构来保存所有数据成员,然后将结构(通过引用)传递给每个函数。
struct CountryTracker std::vector<int> ID; std::string name; //etc...
`void print_results(CountryTracker& Obj) //pass single struct into functions`
【讨论】:
【参考方案4】:执行此操作的 OOP 方法是创建一个名为 ElectionInfo
的类,其中:
这些将是它的成员字段:
vector <string> countyNameVector;
vector <int> countyNCount;
vector <int> countyFCount;
vector <int> countyOCount;
int NCount;
int FCount;
int OCount;
int NTotal;
int FTotal;
int OTotal;
这些将是它的成员函数:
void add_county_election_file(const string);
void search_county(const string);
void print_results();
这样你根本不需要传递对向量的引用,而是你可以这样做:
ElectionInfo an_elect_info;
char selection = get_menu_choice();
// some if-statements to decide which of the following to call:
an_elect_info.add_county_election_file(county_name);
an_elect_info.search_county(county_name);
an_elect_info.print_results();
但如果您更愿意继续使用当前的函数式方法:
在您的 main 方法中声明并初始化以下内容:
vector <string> countyNameVector;
vector <int> countyNCount;
vector <int> countyFCount;
vector <int> countyOCount;
int NCount;
int FCount;
int OCount;
int NTotal;
int FTotal;
int OTotal;
应将注释掉的函数声明的语法调整为如下所示:
void add_county_election_file(const string, vector<string>&, vector<int>&, vector<int&, vector<int>&);
(当然定义也要跟上)
你可以这样调用它:
add_county_election_file(countyname, countyNameVector, countyNCount, countyFCount, countyOCount);
对象自动通过引用传递。
【讨论】:
【参考方案5】:重构的基本过程首先应该只涉及代码分组和放置,并且应该只涉及编写新逻辑的最低限度。以此为原则,您可以先按照以下方式修改代码。
string ReadInputString(const char* title)
string s
cout << title;
cin >> s;
void add_county_election_file(const std::string& filename
, std::vector<string>& countyNameVector
, std::vector<int>& countyNCount
, std::vector<int>& countyFCount
, std::vector<int>& countyOCount
)
int NCount = 0;
int FCount = 0;
int OCount = 0;
int NTotal = 0;
int FTotal = 0;
int OTotal = 0;
char vote;
std::ifstream input((filename).c_str());
string countyName;
if(input.is_open())
input >> countyName;
countyNameVector.push_back(countyName);
while(input >> vote)
if(vote == 'N' || vote == 'n')
NCount = NCount + 1;
else if(vote == 'F' || vote == 'f')
FCount = FCount + 1;
else
OCount = OCount + 1;
countyNCount.push_back(NCount);
countyFCount.push_back(FCount);
countyOCount.push_back(OCount);
cout << countyName << endl;
void add_county_election_file()
string fn = ReadInputString("Enter the county file to process: ");
add_county_election_file(fn,g_countyNameVector,g_countyNCount,g_countyFCount,g_countyOCount);
如您所见,我刚刚提取了您的代码并将它们移动到单独的函数中,并更改了名称以使其具有一定的意义。就像函数 ReadInputString 一样——“cin >> s”行最初是“cin >> filename”。抽象名称“s”表示ReadInputString不知道或不关心它从控制台读取的字符串的语义含义。
为了不改变您的主要功能 - 我添加了一个重载的 add_county_election_file,它调用一个函数,然后调用另一个函数。这个想法是你应该保持一些不变并改变其他的(永远),然后在需要时交替。 我已经更改了全局变量的名称,以使用“g_”将它们与局部变量区分开来——关键是“g_”只能在代码中的极少数地方找到。
【讨论】:
以上是关于C++ 实现不使用全局声明的函数的主要内容,如果未能解决你的问题,请参考以下文章