小编Kit*_*YMG的帖子

Java枚举和切换语句 - 默认情况?

对于建议抛出异常的人:
抛出异常不会给我一个编译时错误,它会给我一个运行时错误.我知道我可以抛出一个异常,我宁愿在编译期间死也不会在运行时死掉.

首先,我使用的是eclipse 3.4.

我有一个数据模型,其模式属性是枚举.

enum Mode {on(...), off(...), standby(...); ...}
Run Code Online (Sandbox Code Playgroud)

我目前正在写这个模型的视图,我有代码

...
switch(model.getMode()) {
case on:
   return getOnColor();
case off:
   return getOffColor();
case standby:
   return getStandbyColor();
}
...
Run Code Online (Sandbox Code Playgroud)

我收到错误"此方法必须返回类型java.awt.Color的结果",因为我没有默认情况,并且在函数末尾没有返回xxx. 在有人为枚举添加另一种类型的情况下出现编译错误(例如关闭)所以我不想放置抛出AssertionError的默认情况,因为这将使用修改后的模式进行编译而不会被视为错误直到运行时.

我的问题是:
为什么EclipseBuilder(和javac)没有意识到这个开关涵盖了所有可能性(或者它是否涵盖了它们?)并且停止警告我需要返回类型.有没有办法,我可以做我想要的,而无需向Mode添加方法?

如果失败了,是否有一个选项可以在不包含所有Enum可能值的switch语句上发出警告/错误?

编辑:Rob:这是一个编译错误.我只是尝试用javac编译它,我得到一个"缺少返回语句"错误,目标是方法的最后一个}.Eclispe只是将错误放在方法的顶部.

java enums

56
推荐指数
4
解决办法
4万
查看次数

为什么c ++中的堆被实现为算法而不是容器?

我想知道为什么堆概念作为算法(实现make_heap,pop_heap, push_heap,sort_heap),而不是一个容器.我特别感兴趣的是一些人的解决方案也可以解释为什么setmap容器而不是类似的算法集合(make_set add_set rm_set等).

c++ algorithm heap stl

22
推荐指数
2
解决办法
3130
查看次数

何时使用ServiceTracker与ServiceReference

我刚开始使用OSGi编程,并且有两种方法可以监听被激活的服务.

第一种方法,从EclipseRCP书籍,使用ServiceReference:

String filter="(objectclass="+IModelCreator.class.getName()+")";
context.addServiceListener(this, filter);
modelCreators = Collections.synchronizedMap(
    new HashMap<ModelID, List<IModelCreator>>());
ServiceReference references[] = context.getServiceReferences(null, filter);
if(references==null) return;
for(int i=0;i<references.length;++i) {
    this.serviceChanged(new ServiceEvent(ServiceEvent.REGISTERED,
        references[i]));
}
Run Code Online (Sandbox Code Playgroud)

第二个,来自互联网示例,使用ServiceTracker:

ServiceTracker logReaderTracker = new ServiceTracker(context,
                org.osgi.service.log.LogReaderService.class.getName(), null);
logReaderTracker.open();
Object[] readers = logReaderTracker.getServices();
if (readers != null) {
        for (int i = 0; i < readers.length; i++) {
        LogReaderService lrs = (LogReaderService) readers[i];
        m_readers.add(lrs);
        lrs.addLogListener(m_logger);
    }
}
logReaderTracker.close();
Run Code Online (Sandbox Code Playgroud)

哪一个是保存实现给定接口的所有服务的寄存器的正确和/或最佳方式?有没有其他方法来实现这一目标?为什么似乎有两种方法可以做同样的事情?

java osgi

11
推荐指数
1
解决办法
1万
查看次数

是否有合法的方法使用operator <<打印元组和对?

我有一组模板/函数,允许我打印一个元组/对,假设元组/对中的每个类型都operator<<为它定义.不幸的是,由于17.4.3.1,添加我的operator<<重载是违法的std.还有另一种让ADL找到我的方法operator<<吗?如果没有,包裹我的超载是否有任何实际伤害namespace std{}

感兴趣的人的代码:(我正在使用gcc-4.5)

namespace tuples {
  using ::std::tuple;
  using ::std::make_tuple;
  using ::std::get; 
namespace detail {

template< typename...args >
size_t size( tuple<args...> const& )
{
  return sizeof...(args);
};

template<size_t N>
struct for_each_ri_impl
{
  template<typename Func, typename Tuple>
  void operator()(Func func, Tuple const& arg)
  {
    for_each_ri_impl<N-1>()(func, arg );
    func( get<N>( arg ), size(arg) - N - 1 );
  }
};

template<>
struct for_each_ri_impl<0>
{
  template<typename Func, typename Tuple>
  void operator()(Func func, Tuple …
Run Code Online (Sandbox Code Playgroud)

c++ argument-dependent-lookup c++11

7
推荐指数
1
解决办法
953
查看次数

C++迭代器问题

我有以下会员数据

vector<State<T>*> activeChildren;
Run Code Online (Sandbox Code Playgroud)

我想在析构函数中清理这些指针

StateContainer<T>::~StateContainer() {
    vector<State<T>*>::iterator it =
        activeChildren.begin();
    while(it!=activeChildren.end()) {
        State<T>* ptr = *it;
        it = activeChildren.erase(it);
        delete ptr;
    }
}
Run Code Online (Sandbox Code Playgroud)

我在Ubuntu上从g ++ 4.3.2得到以下错误:

./fsm2/StateContainer.cpp: In destructor ‘virtual ervan::StateContainer<T>::~StateContainer()’:
../fsm2/StateContainer.cpp:24: error: expected `;' before ‘it’
../fsm2/StateContainer.cpp:25: error: ‘it’ was not declared in this scope
Run Code Online (Sandbox Code Playgroud)

谁能告诉我我做错了什么?我在另外两个使用迭代器循环的地方得到了这个错误,但是当我使用for_each(...)时却没有

c++ iterator

6
推荐指数
2
解决办法
2851
查看次数

将char转换为char数组或将char数组转换为char?

所以,假设我有一个char,我想在一行代码中将它strcat()转换为char数组.对于[非实际]示例:

strcat("ljsdflusdfg",getchar());
Run Code Online (Sandbox Code Playgroud)

或者我想反过来说,无论数据类型如何,连接或类型转换字符串的适当功能是什么?或者也许有一些我遗漏的语法......

这是一个例子.它编译得很好,但崩溃.

char* input(){
 char* inp="";
 while(1){
  char c=getchar();
  if(c){
   if(c=='\n'||c==EOF){
    break;
   }else{
    strcat(inp,(char*)c);
   }
  }
 }
 return inp;
}
Run Code Online (Sandbox Code Playgroud)

c string concat char c89

5
推荐指数
1
解决办法
2万
查看次数

标签 统计

c++ ×3

java ×2

algorithm ×1

argument-dependent-lookup ×1

c ×1

c++11 ×1

c89 ×1

char ×1

concat ×1

enums ×1

heap ×1

iterator ×1

osgi ×1

stl ×1

string ×1