struct B
{
int a;
void foo() {a = 5;}
};
template <typename T>
struct A
{
A(int i) { B::foo(); }
A(double d) {}
};
int main()
{
A<int> a(5.0);
}
Run Code Online (Sandbox Code Playgroud)
gcc 4.7.2编译它没有错误.clang 3.4svn抱怨:
$ clang -Wall -Wextra test.cpp
test.cpp:10:16: error: call to non-static member function without an object argument
A(int i) { B::foo(); }
~~~^~~
Run Code Online (Sandbox Code Playgroud)
当然代码是错误的,但哪个编译器符合标准?
同样奇怪的是,如果使用5而不是5.0,则clang不会像gcc那样打印任何"实例化"注释:
$ gcc test.cpp
test.cpp: In instantiation of ‘A<T>::A(int) [with T = int]’:
test.cpp:15:12: required from here
test.cpp:9:13: error: cannot call member …Run Code Online (Sandbox Code Playgroud) 我有一个使用多态的奇怪问题.我有一个实现静态方法的基类.由于各种原因,此方法必须是静态的.基类还有一个纯虚方法run(),由所有扩展类实现.我需要能够run()从静态类调用.
当然,问题是静态类没有this指针.此方法可以在void*参数中传递.我一直试图想出一种聪明的方法将run方法传递给它,但到目前为止还没有任何工作.我也试过把它传递给它.这个问题是我必须实例化它,这需要知道扩展类.这破坏了多态性的整个目的.
关于如何解决这个问题的任何想法?
public class Function
{
public static void main(String args[])
{
System.out.println(power(3,2));
System.out.println(power(3,2));
System.out.println(power(2));
}
public long power(int m)
{
return m*m;
}
public long power(int m,int n)
{
long product=1;
for(int i=1;i<=n;i++)
{
product=product*m;
}
return product;
}
}
Run Code Online (Sandbox Code Playgroud)
编译器显示此错误: -
Function.java:5:无法从静态上下文引用非静态方法power(int,int)
[编辑]
对于缩进的事情很抱歉:/从现在开始我会记住这一点.
好的,我刚刚添加了静态关键字,现在工作正常.这个静态关键字有什么区别?我是java的初学者,还没有研究静态做什么.我肯定会在本书的后续章节中阅读它,但有人请告诉我它的作用.谢谢.
声明:"静态成员变量只能由静态方法更改."
这个语句是否正确,或者静态成员变量是否也可以通过非静态方法更改?
谢谢!
可能重复:
在Java中调用静态方法中的非静态方法
是否可以从静态方法调用非静态方法?非静态位于另一个类中,它必须是非静态的.
public static void start() {
CheckConnection checkInternet = new CheckConnection();
if (checkInternet.isNetworkAvailable()) {
// Has internet Connection
} else {
// No Internet Connection
}
}
Run Code Online (Sandbox Code Playgroud)
代码在Eclipse(Android 4.0.4)中没有给出任何错误,但如果我运行它,我的应用程序会冻结并关闭.
java static android non-static android-4.0-ice-cream-sandwich
亲爱的stackoverflow同志,我再次遇到一个问题,让特定的PowerMock/Mockito案例工作.问题是,我需要验证私有静态方法的调用,该方法是从公共非静态方法调用的.我之前发布的一个类似的例子如何抑制和验证私有静态方法调用?
这是我的代码:
class Factory {
public String factorObject() throws Exception {
String s = "Hello Mary Lou";
checkString(s);
return s;
}
private static void checkString(String s) throws Exception {
throw new Exception();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的测试类:
@RunWith(PowerMockRunner.class)
@PrepareForTest(Factory.class)
public class Tests extends TestCase {
public void testFactory() throws Exception {
Factory factory = mock(Factory.class);
suppress(method(Factory.class, "checkString", String.class));
String s = factory.factorObject();
verifyPrivate(factory, times(8000)).invoke("checkString", anyString());
}
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是,测试是成功的,但它不应该.它不应该是因为私有静态方法应该被正确调用1次.但无论我在时间()中放置什么价值,它总是验证它是真的...... halp :(
关于变量或方法何时应该是静态的,我有点困惑.我开发了一个包含多个类,变量和方法的应用程序,很少使用关键字static.但它的工作令人满意.你能告诉我,我是否犯了错误,为什么?以下是我的代码示例:
public class GameActivity extends AppCompatActivity {
public String[] mots = {"AFTERNOON", "AIRPORT","AVENUE","BETWEEN", "BUS", "CAB", "COAST","DAY",
"DIFFERENCE","DOLLARS","ENGLISH","FRENCH","GOOD","GOODBYE","HOUR","IMPROVE","LATER",
"LOCAL","MARGARET","NAME","NINE","NUMBER","ONLY","PHONE","PLANE","SAME","SHARE",
"SIDEWALK","STATES","SUNDAY","THERE","TIME","TWELVE","UNITED","UNIVERSITY","VERY",
"WEST","WHEN","WOMAN","YOUNG"};
public String[] alphabet = {"A","B","C","D","E","F","G","H","I","J","K","L","M",
"N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
public String mysteryWord = "vide";
//public int nombreDeLettres;
public int numeroImage = 1;
public boolean jeuFini = false;
public int lettresDevinees = 0;
public int wins = 0;
public int losses = 0;
public int numberOfMots;
int numeroAuHasard;
public Boolean maLettreAServi = false;
public ArrayList<CharSequence> lettresEssayees = new ArrayList<>();
public Button monBouton;
public TextView …Run Code Online (Sandbox Code Playgroud) 我有一个静态功能:
void E::createEP(std::list<double>* ret, double length, double (*getHeight)(double)) {
// magic
double sampleIntervall = //from magic
double dist = 0;
while (length - dist > -0.1) {
ret->push_back(dist, (*getHeight)(dist));
dist += sampleIntervall;
}
}
Run Code Online (Sandbox Code Playgroud)
在不同的调用中,我有两个不同的函数作为getHeight()传递:
E为createEP()(对于"再创造"具有不同参数),其需要访问元素的字段,因此可以不是静态的,无论是.以某种方式可以将非静态函数作为参数传递给静态函数吗?
如果没有,那么最优雅的替代方案是什么?我不想复制整个代码createEP().
是否可以在类中创建非静态模板字段?
如果没有,如何解决?
应根据需要在编译时创建此类字段.
我有很多的B-class一样B1,B2,B3.
(在实际情况中,他们有更有意义的名字.)
我想创建一个类D有非静态模板函数add<BX>()是必须counter++每次我称呼它,每一个人的时间BX,对于D的特定情况下
(在现实情况下,它确实有些事情更复杂.)
这是一个实现它的工作演示.
可悲的是,我现在有硬编码每一个BX,一个接一个(B1,B2,B3内部)D: -
class B1{};class B2{};class B3{};
class Counter{
public: int counter=0;
};
template<class BX>class Tag{};
class D{
Counter countB1;
Counter countB2;
Counter countB3;
public: template<class BX> void add(){
add_(Tag<BX>());
}
private:
void add_(Tag<B1>){ countB1.counter++;}
void add_(Tag<B2>){ countB2.counter++;}
void add_(Tag<B3>){ countB3.counter++;}
public: …Run Code Online (Sandbox Code Playgroud) 简单的问题是我可以使用其他函数而不是println,因为我想将非静态变量输出到文件usig out.println();
这是我的代码:
import java.io.*;
public class main {
String outputString ="Math.sqrt(25);" ;
static String outputPath ="src/output.txt";
/**
* @param args
*/
public static void main(String[] args) throws IOException {
File f;
f= new File (outputPath);
//file creation
if(!f.exists()){
f.createNewFile();
System.out.println("File has been created");
}else{
f.delete();
System.out.println("1. File has been deleted");
f.createNewFile();
System.out.println("2. File has been created");
}
//adding string(text) to file
try{
FileWriter outFile = new FileWriter(args[0]);
PrintWriter out = new PrintWriter(outFile);
out.println(outputString);
out.close();
}catch(IOException e){
e.printStackTrace();
}
} …Run Code Online (Sandbox Code Playgroud)