最近有人看了我的代码并评论说它过于程序化.需要说明的是,他们看到的代码并不多 - 只是一个部分清楚地概述了应用程序中采取的逻辑步骤.
if(downloadFeeds(ftpServer, ftpUsername, ftpPassword, getFtpPathToLocalPathMap())) {
loadDataSources();
initEngine();
loadLiveData();
processX();
copyIds();
addX();
processY();
copyIds();
addY();
pauseY();
resumeY();
setParameters();
}
Run Code Online (Sandbox Code Playgroud)
然后,这些不同的方法创建了一大堆不同的对象,并根据需要在这些对象上调用各种方法.
我的问题是 - 是一段明确驱动你的应用程序的代码,例如,指示程序编程,如果是这样,那么实现相同结果的更多OO方式是什么?
所有评论都非常感谢!
在C++ 1z中声明内存有效全局常量的最佳方法是什么,它不进行内部链接,因此在所有翻译单元中使用单个副本?
尽管在许多地方已经提到过,但我们没有任何单一的"最佳方法"问题和答案,所以在这里.以下是我找到相关问题的部分地方列表.
我在找为atleast所有基本基本类型的解决方案,如int,double,char,std::string.
编辑1: 最好的方式,我的意思是"记忆效率".我知道对于内部联系,每个翻译单元都会有多个副本,因此会占用内存.除此之外,如果我们能够实现快速的执行时间和编译时间,这将是伟大的,代码的美化(容易)并不重要.此外,我知道外部链接将增加获取时间,因为处理器可能会在运行时获得缓存未命中.但最新的C++语言是否支持所有这些的最佳方法?或者可能建议支持每个案例?
注意:对于std::string全局常量,最佳方法是什么?是否存在可变性会对有任何影响常量性?
我有一个单一的数据库连接,我得到:
$ dbConnect = myDatabase :: getInstance();
这很容易.我的问题是在函数和类中使用此连接的最少修辞和合法方式是什么?将变量声明为global,将其传递给每个函数,和/或在每个函数中重新创建此变量似乎很愚蠢.还有另一个答案吗?
显然我是一个菜鸟,我可以用10种不同的方式解决这个问题,其中没有一个对我很有吸引力.如果我可以在任何函数中访问$ dbConnect变量而不需要将其声明为全局或传入它,那将会容易得多.我知道我可以将变量添加到$ _SERVER数组中...是否有问题这样做?这似乎有点不合适.
另一个快速问题:这样做是不好的做法:
$ result = myDatabase :: getInstance() - > query($ query);
从一个函数直接?
我之前没有使用过很多静态方法,但最近我倾向于使用更多静态方法.例如,如果我想在类中设置一个布尔标志,或者在一个类中设置一个布尔标志而不需要通过类传递实际对象.
例如:
public class MainLoop
{
private static volatile boolean finished = false;
public void run()
{
while ( !finished )
{
// Do stuff
}
}
// Can be used to shut the application down from other classes, without having the actual object
public static void endApplication()
{
MainLoop.finished = true;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我应该避免的吗?传递一个对象以便使用对象方法更好吗?布尔值finished现在是否计为全局,或者它是否同样安全?
我是一个试图从书中学习C++的新手.下面的代码工作和预期产生输出,但也有定义两行警告engine和randomInt"具有静态存储时间'引擎’的初始化可能会引发无法捕获的异常."
如果我把线7和8的内部main(),警告完全消失,但随后engine并randomInt没有提供给getNumber.
我不知道如何修复警告.另外,也许更重要的是,randomInt在各个地方使用的正确方法是什么main()?声明它main()然后根据需要将它传递给函数是否合适?不知怎的main(),感觉不适合宣布这些类型的东西.
我之前问了一个与此类似的问题,但我仍然在努力理解,并提供了一个希望有用的例子.
// Loosely based on Fig. 6.12: fig06_12.cpp, C++ How To Program, Ninth Edition
#include <iostream>
#include <iomanip>
#include <random>
std::default_random_engine engine( static_cast<unsigned int>( time(nullptr) ) );
std::uniform_int_distribution<unsigned int> randomInt( 1, 6 );
int getNumber();
int main() {
for ( unsigned int counter = 1; counter <= 10; ++counter ) {
std::cout << std::setw( 10 ) << …Run Code Online (Sandbox Code Playgroud) 注意:有一个非常类似的问题在这里.但是,请耐心等待; 我的问题不是"为什么会发生错误",而是"为什么Python实现为在这种情况下抛出错误."
我只是偶然发现了这个:
a = 5
def x()
print a
a = 6
x()
Run Code Online (Sandbox Code Playgroud)
抛出一个UnboundLocalException.现在,我确实知道为什么会发生这种情况(后来在这个范围内,a受到限制,因此a在整个范围内都被认为是本地的).
在这种情况下:
a = 5
def x()
print b
b = 6
x()
Run Code Online (Sandbox Code Playgroud)
这非常有意义.但第一种情况有一个直观的逻辑,这意味着:
a = 5
def x()
print globals()["a"]
a = 6 # local assignment
x()
Run Code Online (Sandbox Code Playgroud)
我想有一个原因是为什么不允许"直觉"版本,但它是什么?虽然这可能是"明确比隐含更好"的情况,但摆弄着globals()总觉得我有点不洁净.
从这个角度来看,发生在我身上的实际情况是别人的剧本,我不得不改变一下.在我的(短暂的)更改中,我在脚本运行时进行了一些文件重命名,所以我插入了
import os
os.rename("foo", "bar")
Run Code Online (Sandbox Code Playgroud)
进入脚本.这个插入发生在一个函数内部.模块已经os在顶级导入(我没有检查过),有些os.somefunction调用在函数内部进行,但在插入之前.这些电话显然触发了一个UnboundLocalException.
那么,有人可以向我解释这个实现背后的原因吗?是为了防止用户犯错误?"直观"的方式会让字节码编译器的内容变得更复杂吗?或者是否有一种我没有想到的歧义?
可能的重复:
全局变量坏吗?
我正在编写一个利用材料和能源特定数据的模拟代码。该数据存储在全局数组中,因为一旦上传,它们将在模拟过程中使用,并且应该可以被大多数函数访问。
我到处都读到使用全局变量不是一个好习惯。有人能给我解释一下,或者给我指点网络上的资料,解释我如何在需要使用大量数据数组的同时避免在模拟应用程序编码中使用全局数组。我尝试用 C++ 编写代码并尽可能多地使用面向对象的特性。
在此先感谢您的帮助。
我想知道装饰函数是否有办法引用装饰器包装器创建的对象.当我想要使用装饰器时,我的问题出现了:
但是,修饰函数需要引用包装器创建的图形.装饰函数如何引用该对象?我们是否必须诉诸全局变量?
这是一个简短的例子,我在装饰函数中引用了一个在包装器中创建的变量(但是我没有设法在没有使用全局变量的情况下执行此操作):
def my_decorator(func):
def my_decorator_wrapper(*args, **kwargs):
global x
x = 0
print("x in wrapper:", x)
return func(*args, **kwargs)
return my_decorator_wrapper
@my_decorator
def decorated_func():
global x
x += 1
print("x in decorated_func:", x)
decorated_func()
# prints:
# x in wrapper: 0
# x in decorated_func: 1
Run Code Online (Sandbox Code Playgroud)
我知道这很容易在课堂上完成,但我出于好奇而问这个问题.
所以,我正在编写控制台游戏作为我的第一个关于C++的项目,我想要做的是实现look函数.这是它的作用:
从2d字符串cout描述获取当前坐标读取描述
但我不能让那个2d字符串数组工作.
string zoneid[100][100];
zoneid[1][1] = "text";
cout << "You see " << zoneid[1][1] << endl;
Run Code Online (Sandbox Code Playgroud)
它在第一行的'='标记之前给出了错误 - 预期的构造函数,析构函数或类型转换.我尝试用括号,花括号,仍然没有帮助.谷歌搜索也没有多大帮助.
更新:这里是完整的代码,但错误只在行zoneid [1] [1] ="text"上;
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <stdlib.h>
#include "genlib.h"
#include "strutils.h"
#include <time.h>
#include <string>
int inventory_array[49];
int coordsX;
int coordsY;
std::string zoneid[100][100];
zoneid[1][1] = "Text";
void init_inv()
{
for (int i=0; i < 50; i++) {
inventory_array[i] = 0;
}
}
void introduce() {
cout << "Welcome to Diablo 2! "
<< …Run Code Online (Sandbox Code Playgroud) 在Visual Studio 2012(C++)中,在开头声明变量以使其具有全局范围并同时设置变量的值就足够了.如何在Qt 5.3中创建全局变量并初始化?
我试图在头文件中声明它,但我有一个问题:"只能在类中初始化静态const积分数据成员".
提前致谢!