我在设计软件时遇到了问题.我有一个非常大的对象(BO),让我们说一个动态数组的映射,我需要访问各种类.每次类使用BO时,它都会向其添加新数据,或者使用BO中的某些数据来进行计算.
作为一个新手,我迷失在如何用C++设计这样一个对象,以便我的代码设计和架构是好的.研究Singleton时,制作一个全局变量是不够有效的,但发现规则是你只能访问该对象,而不是更改它.
任何人都可以指出我正确的方向?我应该遵循哪种设计模式是最有效和可扩展的?
谢谢
根据这里的答案,以下是正确的设计 - 它是psudo!
Class BigObject {
private static BigObject instance = null;
private map;
private BigObject() { }
public static BigObject getInstance() {
if (instance == null) {
instance = new BigObject();
}
return instance;
}
public getArray(string key) {
return map[key];
}
public setBigObject(string key, Array value) {
map.insert(key, value);
}
Run Code Online (Sandbox Code Playgroud) 我真的陷入了我的应用程序中的这个问题,这会导致点击按钮后崩溃.
我有一个单独的"Comment"对象类(CommentLab类,在一个arrayList中保存注释),一个CommentListFragment,它有我的注释的listView,以及PostCommentFragment,用于在CommentLab中向arrayList添加新的注释.
我向我添加了一个OptionMenu CommentListFragment,当我点击optoinMenu中的New Comment项时,我希望它启动CommentListFragment类,我可以在其中编辑和添加新注释.
以下是协同工作的部分内容:
在CommentListFragment中:
// method to add an option menu to the fragment
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.fragment_comment_list, menu);
}
// method to indicate what to do when an item is selected on the menu(which,what)
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.menu_item_new_comment:
Comment comment = new Comment();
CommentLab.get(getActivity()).addComment(comment);
Intent i = new Intent(getActivity(), PostCommentActivity.class);
i.putExtra(PostCommentFragment.EXTRA_COMMENT, comment.getId());
startActivity(i);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
Run Code Online (Sandbox Code Playgroud)
PostCommentActivity(PostCommentFragment的托管活动):
public …Run Code Online (Sandbox Code Playgroud) 我的程序中有大约+30个动态分配的数组,每个区域的定义如下:
int Nx = 240;
int Ny = 240;
double* array = new double(Nx*Ny);
Run Code Online (Sandbox Code Playgroud)
我可以为其中的16个分配值,但是一旦我到达第17个,它就会抛出seg错误!
这是抛出它的代码,完全没问题!
for (int i = 0; i < Nx*Ny; i++) {
array[i] = 0;
}
Run Code Online (Sandbox Code Playgroud)
我真的不知道为什么,我想要用完堆,但因为我有4GB的RAM应该是不可能的!我正在使用MSVS15并在Windows 10上运行该程序!
知道为什么会这样吗?确切的错误:
在ecostress.exe中0x00298389处抛出异常:0xC0000005:访问冲突写入位置0x01D2B000.如果存在此异常的处理程序,则可以安全地继续该程序.